参考: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. css系列(7)成品网页

        本节介绍用css和html组合起来写的页面.(代码可以直接运行)     (1)仿旧版腾讯微博注册页面:(文件夹地址:http://files.cnblogs.com/files/MenAng ...

  2. OpenGL学习进程(7)第五课:点、边和图形(二)边

    本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概 ...

  3. mysql 触发器 存储过程 java调用

    触发器和存储过程是为了提高SQL的运行效率. SQL语句先编译.后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用. 随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不 ...

  4. juniper ssg 常用命令

    netscreen juniper ssg操作命令   2013年4月10日   命令行下取得配置信息 get config   命令行下取得相应时间设置 get clock    set vrout ...

  5. Shell中数学计算/运算

    shell中的赋值和操作默认都是字符串处理. 1)使用let(只能进行整数运算)var=1let "var+=1"echo $var输出结果为2 注意:a)let几乎支持所有的运算 ...

  6. 【BZOJ1854】游戏[SCOI2009](神奇贪心+并查集)

    这道题和今年GDKOI的Day2T2很像(然而gdkoi的题用网络流可以A,这道题只能拿30). 网址:http://www.lydsy.com/JudgeOnline/problem.php?id= ...

  7. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  8. 区间dp的感悟

    学区间dp似乎也很久了...对区间dp的通用模型都了解了一些 但是做题还是很坑 上了一点难度的题基本想不出什么思路.. 目前的做题方式就是看题 想一会发现自己不会做 看题解 好巧妙啊 理解后写一发.. ...

  9. Python-flask中数据库连接池DBUtils

    一.DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 连接池的三种模式: 第一种模式:             它的缺点:每一次请求反复创建数据库的链接,链接的次数太多 ...

  10. eclipse下进行c开发,使用zeromq

    使用eclipse开发代码,一段zeromq的代码. #include <string.h> #include <stdio.h> #include <unistd.h& ...