NodeJs笔记

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 返回匹配的字符串

js正则cheat sheet

7、文件读写

相关api参考

8、cheerio

利用cheerio遍历

$('img').each((i, ele) => {
    console.log(i + "is" + $(ele).attr('src'));
})

参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章