1、让node在后台运行
安装forever依赖
npm install -g forever
启动node
forever start xxx.js
关闭node进程
forever start xxx.js
以npm start启动文件
forever start -c “npm start” 路径
2、node定时任务
安装node-schedule依赖
npm install node-schedule
使用其中的对象文本语法定时器如下
schedule.scheduleJob({hour: 16, minute: 11, dayOfWeek: 1}, function() {
console.log('定时任务:' + new Date());
});
如上代码表示在每周一的16点11分触发。其它可选的参数为
- dayOfWeek
- month
- dayOfMonth
- hour
- minute
- second
其它用法参见
3、Promise
如下定义一个promise
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('执行完成');
resolve('随便什么数据');
}, 2000);
});
new出Promise的时候它就会被执行,所以Promise一般是在函数中定义。因为Promise上为then、catch方法,常见的使用方式是在函数中返回Promise,那么就可以链式调用。如下
function runAsync(){
var p = new Promise(function(resolve, reject){
//做一些异步操作
setTimeout(function(){
console.log('执行完成');
resolve('随便什么数据');
}, 2000);
});
return p;
}
// 链式调用如下
runAsync().then(data => {
//
}).catch(err => {
//
)
其中,then可以无限的调用。参见如下示例
示例一
runAsync1().then(data => {
console.log('第一个then' + data)
}).then(data => {
console.log('第二个then' + data)
})
打印日志如下:
异步任务1执行完成
第一个then随便什么数据1
第二个thenundefined
可以发现前一个then的返回值是后一个then的参数,如果没有return语句,则下一个then的参数即为undefined。
示例二
runAsync1().then(data => {
console.log('第一个then' + data)
return "传给下一个then"
}).then(data => {
console.log('第二个then' + data)
})
打印日志如下:
异步任务1执行完成
第一个then随便什么数据1
第二个then传给下一个then
示例三
runAsync1().then(data => {
console.log('第一个then' + data)
return runAsync2() // 其中runAsync2方法同上面runAsync(),只是说明文本不一样
}).then(data => {
console.log('第二个then' + data)
})
打印日志如下:
异步任务1执行完成
第一个then随便什么数据1
异步任务2执行完成
第二个then随便什么数据2
所以,then里面既可以返回Promise对象,也可以返回其他对象,也可以不返回(如果该then后面还有then的话,那么其参数为undefined)。
一般的,当任何一个then中发生错误时,那么后面的then不会在执行,并且会回调catch方法。
当有多个异步任务同时在执行,并且在所有异步任务执行完成时要进行某些操作,此时则可以使用Promise.all()方法,如下:
Promise.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results);
});
如上代码会在3个异步任务执行完成时调用then,并且把3个任务的返回结果以数组的形式传递给then。
但当其中有一个异步任务完成时需要进行某些操作时,则可以使用Promise.race()方法,如下:
Promise.race([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results);
});
如上代码,当有一个方法执行完时就会进入then方法。需要注意的是,此时其它的异步任务并不会结束,还是会执行完。
4、异步操作
node采用v8引擎处理javascript脚本,最大特点是单线程运行,一次只能运行一个任务。所以在node中大量采用异步任务。很多回调函数的第一个参数为err,是因为等到异步函数执行完成时,前期操作已经执行完了,错误的执行栈已经不存在了,所以只能把错误交给回调函数处理。
异步中的错误还可以层层传递,如下:
if(err) {
// 除了放过No Permission错误意外,其他错误传给下一个回调函数
if(!err.noPermission) {
return next(err);
}
}
5、模块化
node中模块与文件是一一对应的关系,加载一个模块也即加载一个文件。
require用于加载模块,加载时可以省略文件名后缀,如下:
var circle = require('./circle.js');
// 或者
var circle = require('./circle');
上述两种写法均可以。
模块加载了会被缓存,所以如果想要多次执行,则可以让模块返回一个方法,然后调用该方法即可。
如下核心模块不用加载就可以使用:
http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
自定义模块, 如下:
// foo.js
// 导出一个方法
module.exports = function(x) {
console.log(x);
};
或者
// foo.js
// 导出一个对象
var out = new Object();
function p(string) {
console.log(string);
}
out.print = p;
module.exports = out;
6、正则表达式
js中的正则语法格式如下:
/正则表达式主体/修饰符(可选)
可选修改符有
i 忽略匹配中的大小写
g 全局查找
m 匹配多行
在字符串中使用正则常用search()与replace()方法。如下:
var s = "helloworld";
var n = s.search(/wo/igm); // 注意正则表达式没有引号
console.log(n);
返回匹配字符串在待查找字符串中的位置。
var k = s.replace(/wo/igm, '我');
console.log(k);
打印出:hello我rld
Js中正则表达式对应RegExp对象(需要翻墙访问),其定义了相关的属性和方法。其中如test(),exec()等。
var a =/a/i;
var s = "shenxing";
console.log(a.test(s)); // false
console.log(a.exec(s)); // null 返回匹配的字符串
7、文件读写
8、cheerio
利用cheerio遍历
$('img').each((i, ele) => {
console.log(i + "is" + $(ele).attr('src'));
})