参考: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. Apache Kudu

    Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力.Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和 ...

  2. 利用 :before 特性实现图片按比例显示

    好吧,想不到自称布局小沙弥的我会被图片按比例显示给尴尬到. 设计师跟我说,这里的图要按 750x330 的,好吧,但这图是屏宽呀,屏幕宽度会变化的,那高度也会不定咯, 要么裁图片(工作量大),要么给定 ...

  3. 网络:W5500抓包TCP segment of a reassembled PDU

    1.问题描述 W5500 http测试,用wireshark抓包,发现出现很多TCP segment of a reassembled PD. 2. 问题分析 TCP segment of a rea ...

  4. PHP搜索文件夹下全部文件

    搜索文件夹下全部文件 //搜索文件夹下全部文件,暂时不支持中文文件名 public function scanFile($path) { if (!is_dir($path)) return arra ...

  5. ORA-01034和ORA-27101的错误

    我本机安装的数据库版本是ORACLE 11G R2,用plsql连接时候,报ora-12514如下错误: 但是在cmd里用sqlplus连接已经创建的用户时候,报如下错误: ORA-01034 - O ...

  6. springmvc中url-url-pattern /和/*的区别

    在使用springmvc时,都会在web.xml中配置一个dispatchservlet,如下: <listener> <listener-class> org.springf ...

  7. ZK服务管理中心

    ZK基础类及服务的注册与发现: package top.letsgogo.util; import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zk ...

  8. 先有Class还是先有Object?

    先有Class还是先有Object? Java的对象模型中: 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例. 所有的类都最终继承自Object类,Cla ...

  9. HTTP Status 500:报错Unsupported major.minor version 51.0(unable to load class XXX)

    这个是jdk版本和JRE不匹配导致的. 报错信息: 问题详解:(待填) 处理: 1.检查jdk和jre版本是否匹配 ——打开命令行界面(cmd),分别输入java -version 和javac -v ...

  10. HRBUST 2072 树上求最大异或路径值

    一个很经典的套路 思想是 F [u,v] = F[1,u] ^ F[1,v] 这样就转化成了n个数两两异或 求最大值 可以用字典树来做 每次用当前数去树中寻求最大xor值 然后把这个数字插进去 就相当 ...