Node.js 基礎(chǔ)知識(shí)

在開(kāi)始講解 Node.js 相關(guān)知識(shí)之前,我們先來(lái)聊聊 Node.js 的一些基礎(chǔ)知識(shí):如何正確退出Node.js 應(yīng)用,環(huán)境變量,部署方式選擇。
如何退出 Node.js 應(yīng)用
我們有多種退出 Node.js 應(yīng)用程序的方式,當(dāng)你在命令行中運(yùn)行程序時(shí),你可以通過(guò) ctrl-C 關(guān)閉它,但在這里我想討論的是以編程方式退出。
讓我們從最激進(jìn)的一個(gè)開(kāi)始介紹,看看為什么你最好不要使用它。
process 核心模塊提供了一個(gè)方便的方法,允許你以編程方式退出 Node.js 程序: process.exit()當(dāng) Node.js 運(yùn)行到此行時(shí),將立即強(qiáng)制終止該進(jìn)程。
這意味著任何待處理的回調(diào),任何仍在發(fā)送的網(wǎng)絡(luò)請(qǐng)求,任何文件系統(tǒng)訪問(wèn)或?qū)懭?stdout 或 stderr 的進(jìn)程—— 所有都將立即被終止。
如果這對(duì)你沒(méi)有問(wèn)題,你可以傳遞一個(gè)整數(shù),該整數(shù)表示操作系統(tǒng)的退出代碼:
process.exit(1)
默認(rèn)情況下,退出代碼為0,表示成功。不同的退出代碼具有不同的含義,你可能希望在自己的系統(tǒng)中使用它們以使程序與其他程序通信。你可以在此處閱讀退出代碼的更多信息。
你還可以設(shè)置 process.exitCode屬性:
process.exitCode =1
當(dāng)程序運(yùn)行結(jié)束時(shí),Node.js將返回該退出代碼。所有處理完成后,程序?qū)⒄M顺觥?/p>
很多時(shí)候使用 Node.js 我們啟動(dòng)服務(wù)器,比如這個(gè)HTTP服務(wù)器:
const express = require('express')const app = express()app.get('/',(req, res)=>{res.send('Hi!')})app.listen(3000,()=> console.log('Server Ready'))
這個(gè)程序永遠(yuǎn)不會(huì)結(jié)束。如果調(diào)用 process.exit(),則任何當(dāng)前掛起或正在運(yùn)行的請(qǐng)求都將被中止,這不是一種好的處理方式。
在這種情況下,你需要向命令發(fā)送 SIGTERM信號(hào),并使用進(jìn)程信號(hào)處理程序處理該信號(hào):
注意: process不需要手動(dòng)引入,它會(huì)自動(dòng)引入。
const express = require('express')const app = express()app.get('/',(req, res)=>{res.send('Hi!')})app.listen(3000,()=> console.log('Server Ready'))process.on('SIGTERM',()=>{app.close(()=>{console.log('Process terminated')})})
信號(hào)是什么?信號(hào)是一種可移植的操作系統(tǒng)接口(POSIX)內(nèi)部通信系統(tǒng):向進(jìn)程發(fā)送通知,以便在發(fā)生事件時(shí)通知它。 SIGKILL 是告訴進(jìn)程立即終止的信號(hào),理想情況下就像 process.exit() 一樣。
SIGTERM 是指示進(jìn)程正常終止的信號(hào)。這是來(lái)自 upstart 或 supervisord 等流程管理器發(fā)出的信號(hào)。
你可以從程序內(nèi)部發(fā)送此信號(hào),在一個(gè)函數(shù)中:
process.kill(process.pid,'SIGTERM')
或者從另一個(gè)正在運(yùn)行的 Node.js 程序,或者其他你想終止的運(yùn)行在你系統(tǒng)上的你知道PID的進(jìn)程。
如何從 Node.js 讀取環(huán)境變量
Node.js 的 process 核心模塊 提供了 env 屬性,它托管了進(jìn)程啟動(dòng)時(shí)設(shè)置的所有環(huán)境變量。
以下是訪問(wèn) NODE_ENV環(huán)境變量的示例,該變量默認(rèn)為 development。
process.env.NODE_ENV // "development"
在腳本運(yùn)行之前將其設(shè)置為 production 將告訴 Node.js 這是一個(gè)生產(chǎn)環(huán)境。
通過(guò)這種方式,你可以訪問(wèn)你設(shè)置的任何自定義環(huán)境變量。
在哪兒部署你的 Node.js 應(yīng)用
Node.js應(yīng)用程序可以在很多地方托管,具體取決于你的需求。
下面是一個(gè)簡(jiǎn)單的不完整的可選服務(wù)清單,當(dāng)你想要部署你的應(yīng)用程序并使其可公開(kāi)訪問(wèn)時(shí),你可以查看這些選項(xiàng)。
我將從最簡(jiǎn)單的介紹到更為強(qiáng)大更復(fù)雜的部署方式。
最簡(jiǎn)單的選擇:本地隧道
即使你擁有動(dòng)態(tài)IP,或者你使用的是NAT,也可以使用本地隧道部署應(yīng)用程序并直接由本機(jī)提供服務(wù)。這適用于一些快速測(cè)試,演示產(chǎn)品或與極少數(shù)人共享小應(yīng)用。
ngrok 是一個(gè)非常好用的工具,適用于所有平臺(tái)。
使用它,你只需輸入 ngrok PORT,你想要的端口就會(huì)暴露在互聯(lián)網(wǎng)上。 你可以獲得一個(gè)ngrok.io域名,但通過(guò)付費(fèi)訂閱,你可以獲得自定義URL以及更多安全選項(xiàng)(請(qǐng)注意,你正在將計(jì)算機(jī)打開(kāi)到公共Internet)。
你也可以使用localtunnel:
npm install -g localtunnel# 指定端口 啟動(dòng)隧道lt --port 8000
零配置部署
Zeit Now
Zeit是一個(gè)有趣的選擇。 你只需在終端中輸入 now命令,它就會(huì)負(fù)責(zé)部署你的應(yīng)用程序。 有免費(fèi)版本,付費(fèi)版本更強(qiáng)大。你會(huì)忘記服務(wù)器,只管部署應(yīng)用程序就行了。
Heroku
Heroku是一個(gè)了不起的平臺(tái)。它的官網(wǎng)有關(guān)于部署 Node.js 的詳細(xì)文檔
虛擬主機(jī)
這兒我會(huì)介紹一些體驗(yàn)不錯(cuò)的免備案虛擬主機(jī)提供商,以推薦程度從高到低排序:
vultr 我一直使用的 VPS,速度也還不錯(cuò)
AWS aws 提供了一年的的免費(fèi)試用
Digital Ocean
Linode
相關(guān)推薦:
Node.js 入門(mén)指南:Node.js 簡(jiǎn)介

左手代碼右手磚,拋磚引玉
給點(diǎn)個(gè)贊,好不好啊
▽點(diǎn)擊閱讀原文 獲得更好的閱讀體驗(yàn),
可查看相關(guān)鏈接
