使用forever设置node服务开机启动

1.新建启动脚本 nodeForever.sh 放到/etc/init.d 目录下面
touch /etc/init.d/nodeForever.sh
脚步内容:

#!/bin/sh
### BEGIN INIT INFO
# Provides: xiaoshuo
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: leo service
# Description: leo service daemon
### END INIT INFO

forever start /var/www/html/files/hfhleo/files/web/node/n1/app.js

2、设置可执行
chmod +x /etc/init.d/nodeForever.sh

3、脚本放到启动脚本中去
cd /etc/init.d
sudo update-rc.d /etc/init.d/nodeForever.sh defaults 100
语法:sudo update-rc.d defaults
是这个脚本的启动的顺序号,去这个etc文件夹下面的这几个文件夹中看看,选个合适的数字

4、关于forever的一些注意事项
开机自动启动的forever启动的node进程用forever list命令并不能查到,想要查应该用linux系统的命令
ps -ax

Promise.all实现多个同步的异步

1.创建路由,使用phantomjs抓取页面
const BookInfo = require(‘./containers/BookInfo’);
[code]router.get(‘/bookInfo’, async (ctx, next) => {
//var keys = escape(ctx.request.body.val);
var bid = ctx.request.query.bid;
var authorId = ctx.request.query.authorId;

let data = {};
//获取小说详细信息
let nowBook = function(){ return BookInfo.getBookinfo({
url: encodeURI(`https://book.qidian.com/info/${bid}`),
userAgent: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36”
});
}
//获取小说其他书籍
let otherBook = function(){ return BookInfo.getOtherBook({
url: encodeURI(`https://my.qidian.com/author/${authorId}`),
userAgent: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36”
});
}

var p1 = new Promise(function(resolve, reject) {
let ddd = BookInfo.getBookinfo({
url: encodeURI(`https://book.qidian.com/info/${bid}`),
userAgent: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36”
});
resolve(ddd)
});
var p2 = new Promise(function(resolve, reject) {
let ddd = BookInfo.getOtherBook({
url: encodeURI(`https://my.qidian.com/author/${authorId}`),
userAgent: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36”
});
resolve(ddd)
});
let results = await Promise.all([p1, p2]);
console.log(results)
data = results[0].result;
data.authorBooks = results[1].result;

ctx.body = {
status: 1,
data: data
}

});[/code]

2.使用phantomjs抓取
[code]const phantom = require(‘phantom’);

const getBookinfo = async (ops)=> {
console.log(Date.now())
let data = {};
//创建实例
let instance = await phantom.create();
//创建页面容器
let page = await instance.createPage();
//设置
page.setting(“userAgent”, ops.userAgent)
//判断是否访问成功
let status = await page.open(ops.url),
code = 1;
if (status !== ‘success’) {
//访问失败修改状态码
code = -1;
} else {
//获取当前时间
var start = Date.now();

var result = await page.evaluate(function() {
///获取最新的讨论
var commentCon = [];
$(‘.discuss-list li.cf’).each(function(i, elem) {
var bb = $(elem).find(‘.discuss-info’);
commentCon.push({
ico: “https:”+$(elem).find(‘.user-photo img’).attr(‘src’)+”.png”,
name: bb.find(‘.blue’).text(),
//xin: (bb.find(‘.score-min’).attr(‘class’)).split(‘star’)[1],
extend: bb.find(‘h5 a’).text(),
time: bb.find(‘.info ‘).children(‘span’).text()
})

});
return ({
introduce: $(‘.book-content-wrap .book-intro p’).text(),
//评论数
comment: parseInt($(‘#J-discusCount’).text().split(“(“).join(“”)),
/////前15条评论内容
commentCon: commentCon,
ptotal: parseInt($(‘#J-catalogCount’).text().split(“(“).join(“”))
})
})
data = {
status: code,
url: ops.url,
time: Date.now() – start,
result: result
}
}
//退出实例
await instance.exit();

return data;
};

const getOtherBook = async (ops)=> {
console.log(Date.now())
let data = {};
//创建实例
let instance = await phantom.create();
//创建页面容器
let page = await instance.createPage();
//设置
page.setting(“userAgent”, ops.userAgent)
//判断是否访问成功
let status = await page.open(ops.url),
code = 1;
if (status !== ‘success’) {
//访问失败修改状态码
code = -1;
} else {
//获取当前时间
var start = Date.now();
var result = await page.evaluate(function() {
return $(‘.author-work .author-item’).map(function() {
return ({
id: $(this).find(‘.author-item-title a’).attr(‘data-bid’),
workTime: $(this).find(‘.author-item-time’).text(),
imgUrl: $(this).find(‘.author-item-book img’).attr(‘src’),
name: $(this).find(‘.author-item-title a’).text(),
introduce: $(this).find(‘.author-item-content’).text(),
pageNumbe: $(this).find(‘.author-item-exp’).text(),
nowPage: $(this).find(‘.author-item-update a’).text(),
nowTime: $(this).find(‘.author-item-update span’).text()
})
}).toArray();
})
data = {
status: code,
url: ops.url,
time: Date.now() – start,
result: result
}
}
//退出实例
await instance.exit();

return data;
};

module.exports = {
getBookinfo: getBookinfo,
getOtherBook: getOtherBook
}[/code]

npm 操作

可以通过 NPM 来发布自己的包,为 NPM 上 5000+ 的基础上再加一个模块。
npm publish

命令十分简单。但是在这之前你需要通过 npm adduser 命令在 NPM 上注册一个
帐户,以便后续包的维护。 NPM 会分析该文件夹下的 package.json 文件,然后
上传目录到 NPM 的站点上。用户在使用你的包时,也十分简明:
npm install

甚至对于 NPM 无法安装的包(因为某些奇怪的网络原因),可以通过 github 手
动下载其稳定版本,解压之后通过以下命令进行安装:
只需将路径指向 package.json 存在的目录即可。然后在代码中
require(‘package’) 即可使用。
npm install

nodejs学习笔记

$ npm init
这个命令的作用就是帮我们互动式地生成一份最简单的 package.json 文件
name 。包名,需要在 NPM 上是唯一的。不能带有空格。
description 。包简介。通常会显示在一些列表中。
version 。版本号。一个语义化的版本号( http://semver.org/ ),通常
为 x.y.z 。该版本号十分重要,常常用于一些版本控制的场合。
keywords 。关键字数组。用于 NPM 中的分类搜索。
maintainers 。包维护者的数组。数组元素是一个包含 name 、 email 、
web 三个属性的 JSON 对象。
contributors 。包贡献者的数组。第一个就是包的作者本人。在开源社
区,如果提交的 patch 被 merge 进 master 分支的话,就应当加上这个贡
“contributors”: [{
“name”: “Jackson Tian”,
“email”: “mail @gmail.com”
}, {
“name”: “fengmk2”,
“email”: “mail2@gmail.com”
}],
“licenses”: [{
“type”: “GPLv2”,
“url”: “http://www.example.com/licenses/gpl.h
tml”,
}]
{
“name”: “express”,
“description”: “Sinatra inspired web developm
ent framework”,
“version”: “3.0.0alpha1-pre”,
“author”: “TJ Holowaychuk
献 patch 的人。格式包含 name 和 email 。如:
bugs 。一个可以提交 bug 的 URL 地址。可以是邮件地址
( mailto:mailxx@domain ),也可以是网页地址( http://url )。
licenses 。包所使用的许可证。例如:
repositories 。托管源代码的地址数组。
dependencies 。当前包需要的依赖。这个属性十分重要, NPM 会通过
这个属性,帮你自动加载依赖的包。

$ npm install express utility --save
这次的安装命令与上节课的命令有两点不同,一是没有指定 registry,没有指定的情况下,默认从 npm 官方安装,上次我们是从淘宝的源安装的。二是多了个 –save 参数,这个参数的作用,就是会在你安装依赖的同时,自动把这些依赖写入 package.json。

自动重启node服务
npm install supervisor -g
supervisor app.js

一般写法

// 引入依赖
var express = require(‘express’);
var utility = require(‘utility’);
// 建立 express 实例
var app = express();
app.get(”,function(req,res){
// 从 req.query 中取出我们的 q 参数。
// 如果是 post 传来的 body 数据,则是在 req.body 里面,不过 express 默认不处理 body 中的信息,需要引入 https://github.com/expressjs/body-parser 这个中间件才会处理,这个后面会讲到。
// 如果分不清什么是 query,什么是 body 的话,那就需要补一下 http 的知识了
var q = req.query.q || false;//判断是否又q值
if(q){
// 调用 utility.md5 方法,得到 md5 之后的值
// utility 的 github 地址:https://github.com/node-modules/utility
var md5V = utility.md5(q);
res.send(md5V);
}else{
res.send(‘请添加参数’);
}
})

app.listen(3000,’127.0.0.2′,function(req,res){
console.log(‘端口是这个’)
})