参考: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. Ajax在jQuery中的应用---ajax()方法

    在jQuery中,$.ajax()方法是最底层的方法,也是功能最强的方法.其调用的语法格式为: $.ajax([options]) 其中,可选项参数[options]为$.ajax()方法中的请求设置 ...

  2. Hibernate深入浅出(九)持久层操作——数据保存&批量操作

      数据保存: 1)session.save session.save方法用于实体对象到数据库的持久化操作.也就是说,session.save方法调用与实体对象所匹配的Insert SQL,将数据插入 ...

  3. MODBUS协议 一种问答方式的通信协议

    源:MODBUS协议 一种问答方式的通信协议 ModBus通信系统协议

  4. java 跨数据库导入大数据

    java 跨数据库导入大数据 /** * java程序跨服务器跨数据库批量导入导出百万级数据 * @param args * @throws Exception */ public static vo ...

  5. React Native中组件的props和state

    一.组件的属性(props)和状态(state) 1.属性(props) 它是组件的不可变属性(组件自己不可以自己修改props). 组件自身定义了一组props作为对外提供的接口,展示一个组件时只需 ...

  6. codeforces Codeforces Round #318 div2 A. Bear and Elections 【优先队列】

    A. Bear and Elections time limit per test 1 second memory limit per test 256 megabytes input standar ...

  7. SYN blood攻击

    SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击.效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接请求. 说到原理,还得从TCP如 ...

  8. 从配置maven环境到maven项目的新建

    话不多说,直接入正题. 一.配置maven 环境 首先安装最新版支持javaee的eclipse.我这里下载的版本是eclipse-jee-mars-2-win32-x86_64的新版(我是2017年 ...

  9. Flume-NG启动过程源码分析(一)(原创)

    从bin/flume 这个shell脚本可以看到Flume的起始于org.apache.flume.node.Application类,这是flume的main函数所在. main方法首先会先解析sh ...

  10. Thinkpad E440个性化设置:如何/禁用关闭触摸板?

    #如何禁用/关闭触摸版 默认情况下,ThinkPad E440是不支持触摸板的关闭功能,如果要关闭的话,需要去官方下载相应的鼠标驱动 UltraNav. 下载地址:http://think.lenov ...