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'));
})