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

參考

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