node實踐記錄

process.env

process.env屬性返回一個包含用戶環境信息的對象。

最常見的需求,前端需要根據不同的環境(dev,prd),來調用不同的後端接口。如果用webpack,是這麼做的:

1)package.json裏的命令:

# 通過cross-env配置項往環境裏面注入變量NODE_EVN
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
}

webpack.config.js獲取
console.log(process.env.NODE_ENV)//執行npm run dev,打印development
事實上,以上從命令行獲取環境變量這個件事跟webpack沒有關係,執行node文件也可以這樣獲取。
1)新建文件test.js:
console.log(global.process.env.a);

2)命令行執行test.js:
a=1 node test.js

命令行輸出a的值1。

題外話,如果順序改變呢?命令行執行下面的命令
測試結果:test.js能被執行,但獲取不到a的值。

global.process.env.a這個變量在這次node命名結束前都能獲取到,如果是以後執行也能獲取到,就需要用以下的命令(mac linux):

export a=2 && node test.js

這條命令運行後,只要運行node文件,在文件裏可以得到 global.process.env.a的值爲2.

process.argv

還記得前面說過,下面的命令無法通過 process.env 獲取。

node test.js a=1

這時候就要用到process.argv。他返回當前進程的所有命令行參數,是個數組,前2個元素是node命令路徑和被執行的文件路徑:
在這裏插入圖片描述
所以經常見到

	process.argv.slice(2)

// 獲取輸入參數 --options
// 首先定義好一個對象,然後在裏面填寫默認值
let args = process.argv;
let options = {
    port: 8080
};

// 其次,根據用戶傳入進來的參數進行校驗,最騷的就是++i
// 因爲它改變了 i 的值,然後直接定位到了value
for (let i = 0; i < args.length; i++) {
    let option = args[i].replace(/\-/g, '');
    if (typeof options[option] !== 'undefined') {
        if (args[++i]) {
            options[option] = args[i] || options[option];
        } else {
            console.log(('Missing argument value for ' + option + '!'), '\n');
            return;
        }
    }
}

process是node的全局變量,不用require直接能訪問。中文文檔標註爲:進程對象。它提供當前 Node.js 進程的有關信息,以及控制當前 Node.js 進程。

創建https服務

# 生成https證書
- 生成私鑰key文件:
openssl genrsa -out privatekey.pem 1024

- 通過私鑰生成CSR證書籤名  (需要填一些信息、可直接回車)
openssl req -new -key privatekey.pem -out certrequest.csr

- 通過私鑰和證書籤名生成證書文件 
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

# 導入文件
var https = require('https')
    ,fs = require("fs");

var options = {
    key: fs.readFileSync('./privatekey.pem'),
    cert: fs.readFileSync('./certificate.pem')
};

https.createServer(options, (req,res) => {
    // 這裏填寫你要的文件
}).listen(3011, 'domain')

preflighted request

一個簡單的請求如下:

# HTTP方法是下列之一
HEAD
GET
POST
# HTTP頭包含
Accept
Accept-Language
Content-Language
Last-Event-ID
# Content-Type,但僅能是下列之一
application/x-www-form-urlencoded
multipart/form-data
text/plain
任何一個不滿足上述要求的請求,即被認爲是複雜請求。一個複雜請求不僅有包含通信內容的請求,同時也包含預請求(preflight request)。
# 請求中除GET,POST,Head都需要發送預請求,通過設置一個最大允許時間,可以減少預請求的發送。
http.createServer((req, res) => {
    // req.setHeader('accept-language', 'zh-CN,zh;q=0.9') 
    if (req) {
        res.setHeader('X-Foo', 'bar');
        res.setHeader ('Access-Control-Allow-Methods','PUT,POST,GET,DELETE');
        res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8082');
        res.setHeader("Access-control-max-age", 1000);
        res.setHeader('Access-Control-Allow-Headers', 'Origin, Accept-Language, X-Requested-With, Content-Type, Accept, csrfpreventiontoken');
        res.writeHead(200, {"Content-Type": "application/json;charset=utf-8"});
        res.end('ok');
    }

}).listen(8080, 'ipaddress');
# 獲取頭部信息
req.headers
# 獲取參數
post 請求是放在req.body
get 請求是放在JSON.stringify(url.parse(req.url,true).query)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章