参考:https://github.com/alsotang/node-lessons

感谢!!!

本文属于小白入门级笔记,请大牛自动屏蔽!!!

1.     开发环境

os: 10.12.6

node: v8.9.0

vs code:1.18.0

cnpm@5.1.1 (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js)

npm@5.5.1 (/usr/local/lib/node_modules/cnpm/node_modules/npm/lib/npm.js)

node@8.9.0 (/usr/local/bin/node)

npminstall@3.2.1 (/usr/local/lib/node_modules/cnpm/node_modules/npminstall/lib/index.js)

prefix=/usr/local

darwin x64 16.7.0

registry=http://registry.npm.taobao.org

2.     燥起来吧

一堆随意的开始。

2.1.    创建文件夹

$ cd xx

$ mkdir CarWXWeb

2.2.    创建项目

$ cnpm install express

$ touch app.js

copy 进去这些代码

// 这句的意思就是引入 `express` 模块,并将它赋予 `express` 这个变量等待使用。

var express = require('express');

// 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量。

var app = express();

// app 本身有很多方法,其中包括最常用的 get、post、put/patch、delete,在这里我们调用其中的 get 方法,为我们的 `/` 路径指定一个 handler 函数。

// 这个 handler 函数会接收 req 和 res 两个对象,他们分别是请求的 request 和 response。

// request 中包含了浏览器传来的各种信息,比如 query 啊,body 啊,headers 啊之类的,都可以通过 req 对象访问到。

// res 对象,我们一般不从里面取信息,而是通过它来定制我们向浏览器输出的信息,比如 header 信息,比如想要向浏览器输出的内容。这里我们调用了它的 #send 方法,向浏览器输出一个字符串。

app.get('/', function (req, res) {

res.send('Hello World');

});

// 定义好我们 app 的行为之后,让它监听本地的 3000 端口。这里的第二个函数是个回调函数,会在 listen 动作成功后执行,我们这里执行了一个命令行输出操作,告诉我们监听动作已完成。

app.listen(3000, function () {

console.log('app is listening at port 3000');

});

启动项目:$ node app.js

端口号我修改为8080;

2.3.    创建package.js

$ npm init

会提示输入一堆信息,第一个就是name 不能与文件夹同名,其他的随意了,github地址可以填写一下;

$ cnpm install utility –save

引入 utility 模块并且 依赖关系写入 package.js 详见 字段dependencies

// 引入依赖

var express = require('express');

var utility = require('utility');

// 建立express实例

var app = express();

app.get('/',function(req,res){

var param = req.query.q;

if(param == undefined){

res.send('hello word$$$');

}

else{

var md5Value = utility.md5(param);

res.send(md5Value);

}

});

app.listen(8080,function(){

console.log('启动 端口 8080');

});

增加判断防止无参请求报错!

如果一个项目跟着做下来发现并不能像做 angular cli 保存后自动更新,手动关闭终端。重启 app.js 正常显示。

2.4.    Superagent 充当webclient

没啥好说的直接上代码吧

问题就是没有搞懂request('GET', '/search').then(success, failure); 这种Promise 写法回头补上吧!

var express = require('express');

var utility = require('utility');

var superagent = require('superagent');

var cheerio = require('cheerio');

var app = express();

app.get('/',function(req,res,next){

//用 superagent 去抓取 https://cnodejs.org/ 的内容

//superagent.get('https://cnodejs.org').then(success, failure);

// #region 原版测试

superagent.get('https://cnodejs.org').end(function(err,sres){

// 常规的错误处理

if (err) {

return next(err);

}

// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后

// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`

// 剩下就都是 jquery 的内容了

var $ = cheerio.load(sres.text);

var items = [];

$('#topic_list .topic_title').each(function (idx, element) {

var $element = $(element);

items.push({

title: $element.attr('title'),

href: $element.attr('href')

});

});

res.send(items);

});

// #endregion

});

// #endregion

app.listen(8080,function(){

console.log('启动 端口 8080');

});

2.5.    eventproxy 并发

经验就是要写在一个方法中,经验二就是变量名必须写对~~写错了不报错但是不运行,个人不了解调试。So 只能用最原始的console.log来调试错误了。通过的过程啊!

var eventproxy = require('eventproxy');

var superagent = require('superagent');

var express = require('express');

var cheerio = require('cheerio');

// url 模块是 Node.js 标准库里面的

// http://nodejs.org/api/url.html

var url = require('url');

var cnodeUrl = 'https://cnodejs.org/';

superagent.get(cnodeUrl,function(err,res){

if(err)

return console.error(err);

// 还是需要全局

var topicurls = [];

var $ = cheerio.load(res.text);

// 获取首页所有链接

$('#topic_list .topic_title').each((idx,element)=>{

var $element = $(element);

// $element.attr('href') 本来的样子是 /topic/542acd7d5d28233425538b04

// 我们用 url.resolve 来自动推断出完整 url,变成

// https://cnodejs.org/topic/542acd7d5d28233425538b04 的形式

// 具体请看 http://nodejs.org/api/url.html#url_url_resolve_from_to 的示例

var href = url.resolve(cnodeUrl,$element.attr('href'));

topicurls.push(href);

});

//console.log(topicurls);

// 得到一个 eventproxy 的实例

var ep = new eventproxy();

// 命令 ep 重复监听 topicUrls.length 次(在这里也就是 40 次) `topic_html` 事件再行动

// 相当于 whenall

ep.after('topic_html',topicurls.length,(topics)=>{

// topics 是个数组,包含了 40 次 ep.emit('topic_html', pair) 中的那 40 个 pair

topics = topics.map((pair)=>{

// 接下来都是 jquery 的用法了

var topurl = pair[0];

var tophtml = pair[1];

var $ = cheerio.load(tophtml);

return ({

title: $('.topic_full_title').text().trim(),

href: topurl,

comment1: $('.reply_content').eq(0).text().trim(),

});

});

console.log('异步完成:');

console.log(topics);

});

// 相当于 Task.run

topicurls.forEach((element,idx)=>{

superagent.get(element)

.end((err,res)=>{

// var $ = cheerio.load(res.text);

// var title = $('.topic_full_title').text().trim();

console.log('fetch ' + element + ' successful@'+idx);

ep.emit('topic_html',[element,res.text]);

});

});

});

node.js 笔记(一)的更多相关文章

  1. Node.js笔记1

    Node.js入门笔记 1. node -help 可以显示帮助信息2. node REPL 模式(Read-eval-print loop) 输入—求值—输出循环 直接在cmd输入node 可以进入 ...

  2. node.js 笔记

    教程总结笔记: 学习网站:http://www.runoob.com/nodejs/nodejs-install-setup.html Node.js 中文网及安装文件下载: http://nodej ...

  3. Node.js 笔记02

    一.关于命令 常用命令: dir 列出当前目录下面所有的文件 cd 目录名 进入到指定的目录,. 当前目录, .. 进入上级目录,cd . 当前目录, cd .. 上级目录 md 目录名 创建文件夹 ...

  4. 学习Node.js笔记(一)

    一.什么是Node.js 1.1.Node.js是什么 Node.js是用来编写高性能网络服务器的JavaScript工具包 Node.js 是一个基于Chrome JavaScript 运行时建立的 ...

  5. node.js笔记

    在node环境上面运行js代码,js相当于php,node相当于apache环境 第一步装 node 环境1.从官网下载 dmg 文件安装2.通过命令行安装 需要用到 homebrew(mac上专门用 ...

  6. Node.js笔记4

    4. 文件系统 fs fs模块是文件操作的封装,提供了同步跟异步操作2个版本 * fs.readFile(filename,[encoding],[callback(err,data)]) 是最简单的 ...

  7. Node.js笔记3

    ###Node.js核心模块 1. 全局对象 Node.js中能够访问到的都是global的属性 **process它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口.** ...

  8. Node.js笔记2

    入门二 5. 事件 Node.js中所有的异步I/O操作完成时都会发送一个事件到事件队列. Events 事件模块 `events.EventEmitter` 简单用法: var EventEmitt ...

  9. node.js 笔记一

    现在地址:http://nodejs.org/download/ 我的机器是windows的,选择的文件是,是编译后的版本:Windows Installer (.msi)  32-bit examp ...

随机推荐

  1. bootstrap table 复选框使用

    var columns = [ { field : 'checked', checkbox: true, align: 'center', valign: 'middle', formatter:fu ...

  2. Linux文件系统管理 常见命令df、du、fsck、dumpe2fs

    概述 Linux文件系统管理 常见命令df.du.fsck.dumpe2fs. 文件系统查看命令:df 通过 df 命令可以査看已经挂载的文件系统的信息包括设备文件名.文件系统总大小.已经使用的大小. ...

  3. Docker容器技术-优化Docker镜像

    一.优化Docker镜像 1.降低部署时间 一个大的Docker应用是如何影响在新Docker宿主机上的部署时间. (1)编写Dockerfile创建一个大Docker镜像 [root@bogon ~ ...

  4. 跨平台移动开发_Android 平台使用 PhoneGap 方法

    PhoneGap  下载地址http://phonegap.com/install/    1.打开 Eclipse,在文件菜单下面点击 创建> Android Application Proj ...

  5. 外网IP地址API

    新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域测试方法:http://int.dpool. ...

  6. linux开发应用程序到运行的过程

    1.给linux配置交叉编译环境 2.在windows下使用source insight写程序,一共有m个h文件,n个c文件,k个main函数 3.将源代码放在linux里 4.在源代码文件夹里新建m ...

  7. centOS最小化安装后网络连接问题

    编辑配置文件 vi /etc/sysconfig/network-script/ifcfg-eth0   修改此行重启后即可 ONBOOT="yes"           #修改为 ...

  8. vi编辑器快捷键使用详解

    文本编辑器是所有计算机系统中最常用的一种工具.UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做总结,以资共享!渴望更正和补充! ...

  9. shell脚本:批量修改文件名

    参考链接1:shell脚本:批量修改文件名(删除文件名中字符) 参考链接2:linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ) 参考链接3:每天一个linux ...

  10. java深入探究09-Filter,Listener,国际化

    1.Filter过滤器 1)为是么有过滤器 开发项目中经常遇到直接登录主页面要判断用户是否合法,这类代码比较重复,可以通过过滤器来解决 2)过滤器原理生命周期 服务器创建过滤器对象->一个执行i ...