先決條件: | 完成之前的所有教程主題,包括 Express教程第6部分:使用表單。 |
---|---|
目的: | 了解在何處以及如何將Express應(yīng)用程序部署到生產(chǎn)環(huán)境。 |
一旦您的網(wǎng)站完成(或"足夠"開始公開測試),您將需要將其托管在比您的個(gè)人開發(fā)計(jì)算機(jī)更公開和可訪問的地方。
到目前為止,您一直在開發(fā)環(huán)境中使用Express / Node作為網(wǎng)絡(luò)服務(wù)器將網(wǎng)站共享到本地瀏覽器/網(wǎng)絡(luò), 運(yùn)行您的網(wǎng)站與(不安全)開發(fā)設(shè)置,暴露調(diào)試和其他私人信息。 在您可以外部托管網(wǎng)站之前,您首先必須:
本教程為您選擇托管網(wǎng)站的選項(xiàng)提供了一些指導(dǎo),簡要概述了您的Express應(yīng)用程序準(zhǔn)備投入生產(chǎn)需要做什么,以及如何將LocalLibrary網(wǎng)站安裝到 ="https://www.heroku.com/"class ="external"> Heroku 云托管服務(wù)。
生產(chǎn)環(huán)境是由服務(wù)器計(jì)算機(jī)提供的環(huán)境,您將在其中運(yùn)行您的網(wǎng)站以供外部使用。 環(huán)境包括:
服務(wù)器計(jì)算機(jī)可以位于您的場所并通過快速鏈接連接到Internet,但是使用托管在"云中"的計(jì)算機(jī)是更常見的。 這實(shí)際上意味著你的代碼在托管公司的數(shù)據(jù)中心的一些遠(yuǎn)程計(jì)算機(jī)(或可能是一個(gè)"虛擬"計(jì)算機(jī))上運(yùn)行。 遠(yuǎn)程服務(wù)器通常將以某個(gè)價(jià)格提供一些保證級(jí)別的計(jì)算資源(例如CPU,RAM,存儲(chǔ)器存儲(chǔ)器等)和互聯(lián)網(wǎng)連接。
這種可遠(yuǎn)程訪問的計(jì)算/聯(lián)網(wǎng)硬件被稱為基礎(chǔ)設(shè)施即服務(wù)(IaaS)。 許多IaaS供應(yīng)商提供了預(yù)安裝特定操作系統(tǒng)的選項(xiàng),必須在其上安裝生產(chǎn)環(huán)境的其他組件。 其他供應(yīng)商允許您選擇更多功能齊全的環(huán)境,可能包括完整的節(jié)點(diǎn)設(shè)置。
注意:預(yù)建環(huán)境可以簡化網(wǎng)站設(shè)置,因?yàn)樗鼈儠?huì)減少配置,但可用選項(xiàng)可能會(huì)限制您訪問不熟悉的服務(wù)器(或其他組件),并且可能基于舊版本 版本的操作系統(tǒng)。 通常最好自己安裝組件,以便獲得所需的組件,當(dāng)需要升級(jí)系統(tǒng)的某些部分時(shí),您可以從哪里開始!
其他托管提供商將Express作為平臺(tái)即服務(wù)( PaaS )產(chǎn)品的一部分提供支持。 當(dāng)使用這種托管時(shí),您不需要擔(dān)心大多數(shù)生產(chǎn)環(huán)境(服務(wù)器,負(fù)載平衡器等),因?yàn)橹鳈C(jī)平臺(tái)會(huì)為您處理這些環(huán)境。 這使得部署很容易,因?yàn)槟恍枰獙W⒂谀腤eb應(yīng)用程序,而不是任何其他服務(wù)器基礎(chǔ)設(shè)施。
一些開發(fā)人員將選擇IaaS通過PaaS提供的更大的靈活性,而另一些開發(fā)人員將會(huì)喜歡減少維護(hù)開銷和更輕松地?cái)U(kuò)展PaaS。 當(dāng)您開始使用時(shí),在PaaS系統(tǒng)上設(shè)置您的網(wǎng)站要容易得多,因此這是我們將在本教程中做的。
提示:如果您選擇了一個(gè)Node / Express-friendly托管服務(wù)提供商,他們應(yīng)該提供有關(guān)如何使用不同配置的網(wǎng)絡(luò)服務(wù)器,應(yīng)用服務(wù)器,逆向代理等設(shè)置快捷網(wǎng)站的說明。例如, 是數(shù)字海洋節(jié)點(diǎn)社區(qū)docs "中的各種配置的許多分步指南 >。
有許多托管服務(wù)提供商已知可以使用 Node (和 Express )來積極支持或工作良好。 這些供應(yīng)商以不同的價(jià)格提供不同類型的環(huán)境(IaaS,PaaS)以及不同級(jí)別的計(jì)算和網(wǎng)絡(luò)資源。
提示:有很多托管解決方案,其服務(wù)和定價(jià)可能會(huì)隨時(shí)間而變化。 雖然我們?cè)谙旅娼榻B幾個(gè)選項(xiàng),值得在選擇主機(jī)提供商之前執(zhí)行自己的互聯(lián)網(wǎng)搜索。
選擇主機(jī)時(shí)需要考慮的事項(xiàng):
當(dāng)你開始的好消息是,有相當(dāng)多的網(wǎng)站提供"免費(fèi)"的計(jì)算環(huán)境,盡管有一些條件。 例如, Heroku 提供了一個(gè)免費(fèi)但資源有限的"永久"PaaS 環(huán)境,而 亞馬遜網(wǎng)絡(luò)服務(wù)和 https://azure.microsoft.com/en-us/pricing/details/app-service/"class ="external"> Microsoft Azure 在您首次加入時(shí)提供免費(fèi)贈(zèng)送金額。 許多提供商還具有提供更有用的計(jì)算能力和較少限制的"基本"層。 數(shù)字海洋是一個(gè)流行的托管服務(wù)提供商的示例,提供相對(duì)便宜的基本計(jì)算層(每月5美元 寫入時(shí)的下限)。
請(qǐng)注意:請(qǐng)記住,價(jià)格不是唯一的選擇條件。 如果你的網(wǎng)站是成功的,可能會(huì)證明可擴(kuò)展性是最重要的考慮。
發(fā)布網(wǎng)站時(shí)要考慮的主要因素是網(wǎng)絡(luò)安全和性能。 最低限度,您將希望刪除開發(fā)過程中包含在錯(cuò)誤頁面上的堆棧跟蹤,清理日志記錄,并設(shè)置適當(dāng)?shù)臉?biāo)頭以避免許多常見的安全威脅。
在以下小節(jié)中,我們概述了您應(yīng)該對(duì)應(yīng)用進(jìn)行的最重要的更改。
提示:Express文檔中還提供了其他有用的提示 - 請(qǐng)參閱 >生產(chǎn)最佳做法:性能和可靠性和生產(chǎn)最佳實(shí)踐:安全 / a>。
我們可以通過將 NODE_ENV
環(huán)境變量設(shè)置為生產(chǎn)(默認(rèn)情況下設(shè)置為" development ")來刪除錯(cuò)誤頁面中的堆棧跟蹤。 除了生成較少詳細(xì)的錯(cuò)誤消息,將變量設(shè)置為 緩存視圖模板和從CSS擴(kuò)展生成的CSS文件。 測試表明將 NODE_ENV
設(shè)置為生產(chǎn)可以將應(yīng)用性能提高三倍!
可以通過使用導(dǎo)出或環(huán)境文件或使用OS初始化系統(tǒng)進(jìn)行此更改。
注意:這實(shí)際上是您在環(huán)境設(shè)置中所做的更改,而不是您的應(yīng)用,但重要的是足以在此處注釋! 我們將展示如何為我們的主機(jī)示例設(shè)置如下。
記錄呼叫可能會(huì)對(duì)高流量網(wǎng)站產(chǎn)生影響。 在生產(chǎn)環(huán)境中,您可能需要記錄網(wǎng)站活動(dòng)(例如跟蹤流量或記錄API調(diào)用),但您應(yīng)該嘗試最小化為調(diào)試目的添加的日志量。
減少生產(chǎn)中"調(diào)試"日志記錄的一種方法是使用類似于調(diào)試的模塊, 通過設(shè)置環(huán)境變量來控制執(zhí)行什么日志記錄。 例如,下面的代碼片段顯示了如何設(shè)置"作者"日志記錄。 調(diào)試變量使用名稱"author"聲明,并且將自動(dòng)顯示來自此對(duì)象的所有日志的前綴"author"。
var debug = require('debug')('author'); // Display Author update form on GET exports.author_update_get = function(req, res, next) { req.sanitize('id').escape().trim(); Author.findById(req.params.id, function(err, author) { if (err) { debug('update error:' + err); return next(err); } //On success res.render('author_form', { title: 'Update Author', author: author }); }); };
然后,您可以通過在 DEBUG
環(huán)境變量中將它們指定為逗號(hào)分隔列表來啟用特定的一組日志。 您可以設(shè)置顯示作者和書籍日志的變量,如圖所示(也支持通配符)。
#Windows set DEBUG=author,book #Linux export DEBUG="author,book"?
挑戰(zhàn):調(diào)用 debug
可以替換以前使用 console.log()
或 console.error
/ code>。 使用調(diào)試代碼中的 console.log()
a>模塊。 通過設(shè)置DEBUG變量并在開發(fā)環(huán)境中打開和關(guān)閉日志記錄,并觀察其對(duì)日志記錄的影響。
如果您需要記錄網(wǎng)站活動(dòng),您可以使用日志庫,如 Winston 或 Bunyan 。 有關(guān)此主題的詳情,請(qǐng)參閱:生產(chǎn)最佳做法:性能和可靠性 。
Web服務(wù)器通??梢詨嚎s發(fā)送回客戶端的HTTP響應(yīng),從而顯著減少客戶端獲取和加載頁面所需的時(shí)間。 所使用的壓縮方法將取決于客戶端在請(qǐng)求中支持哪些解壓縮方法(如果不支持壓縮方法,則將以未壓縮的方式發(fā)送響應(yīng))。
您可以使用壓縮中間件將其添加到您的網(wǎng)站。 通過在項(xiàng)目的根目錄運(yùn)行以下命令將其安裝到您的項(xiàng)目。
npm install compression --save
打開 ./ app.js 并需要如圖所示的壓縮庫。 使用 use()
方法將壓縮庫添加到中間件鏈(這應(yīng)該出現(xiàn)在任何你想要壓縮的路由之前 - 在這種情況下,所有的路由!)
var catalog = require('./routes/catalog'); //Import routes for "catalog" area of site var compression = require('compression'); // Create the Express application object var app = express(); ... app.use(compression()); //Compress all routes app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); app.use('/catalog', catalog); ?// Add catalog routes to middleware chain. ...
注意:對(duì)于正在投放的高流量網(wǎng)站,您不會(huì)使用此中間件。 相反,您將使用一個(gè)反向代理,如 Nginx 。
頭盔是一個(gè)中間件軟件包,可以通過設(shè)置適當(dāng)?shù)木W(wǎng)址來幫助保護(hù)您的應(yīng)用免受某些著名的網(wǎng)絡(luò)漏洞 HTTP標(biāo)頭(請(qǐng)參閱文檔,了解其設(shè)置的標(biāo)頭/防護(hù)的漏洞的詳細(xì)信息)。
通過在項(xiàng)目的根目錄運(yùn)行以下命令將其安裝到您的項(xiàng)目。
npm install helmet --save
打開 ./ app.js 并需要頭盔庫,如圖所示。 然后使用 use()
方法將模塊添加到中間件鏈。
var compression = require('compression'); var helmet = require('helmet'); // Create the Express application object var app = express(); app.use(helmet()); ...
請(qǐng)注意:上述命令會(huì)添加可用標(biāo)頭的子集,這對(duì)大多數(shù)網(wǎng)站都有意義。 您可以按照 npm 上的說明,根據(jù)需要添加/停用特定標(biāo)題。
本部分提供了如何在 Heroku PaaS云上安裝 LocalLibrary 的實(shí)際演示。
Heroku是最長時(shí)間運(yùn)行和流行的基于云的PaaS服務(wù)之一。 它最初僅支持Ruby應(yīng)用程序,但現(xiàn)在可以用于托管來自許多編程環(huán)境的應(yīng)用程序,包括Node(因此Express)!
我們選擇使用Heroku有幾個(gè)原因:
雖然Heroku是主辦此演示的完美,它可能不是完美的您的真正的網(wǎng)站。 Heroku使事情容易建立和擴(kuò)展,以更低的靈活性為代價(jià),并且潛在地,一旦你走出免費(fèi)層,更昂貴。
Heroku在一個(gè)或多個(gè)" Dynos "中運(yùn)行網(wǎng)站,這些網(wǎng)站是孤立的,虛擬化的Unix容器,提供 運(yùn)行應(yīng)用程序所需的環(huán)境。 動(dòng)態(tài)鏈接是完全隔離的,并且具有一個(gè)臨時(shí)的文件系統(tǒng)(一個(gè)短暫的文件系統(tǒng),每次重新啟動(dòng)時(shí)被清除/清空)。 dynos在默認(rèn)情況下唯一共享的是應(yīng)用程序配置變量。 Heroku內(nèi)部使用負(fù)載均衡器將網(wǎng)絡(luò)流量分發(fā)到所有"網(wǎng)絡(luò)"動(dòng)態(tài)。 由于它們之間沒有共享,Heroku可以通過添加更多的dynos來水平擴(kuò)展應(yīng)用程序(當(dāng)然,您可能還需要擴(kuò)展數(shù)據(jù)庫以接受其他連接)。
由于文件系統(tǒng)是臨時(shí)的,因此您無法直接安裝應(yīng)用程序所需的服務(wù)(例如數(shù)據(jù)庫,隊(duì)列,緩存系統(tǒng),存儲(chǔ),電子郵件服務(wù)等)。 相反,Heroku Web應(yīng)用程序使用由Heroku或第三方提供的獨(dú)立"附加組件"的后勤服務(wù)。 一旦附加到您的Web應(yīng)用程序,附加服務(wù)通過環(huán)境變量在您的Web應(yīng)用程序中訪問。
為了執(zhí)行您的應(yīng)用程序,Heroku需要能夠設(shè)置適當(dāng)?shù)沫h(huán)境和依賴關(guān)系,并且還了解如何啟動(dòng)它。 對(duì)于Node應(yīng)用程序,需要的所有信息都從 package.json 文件中獲取。
開發(fā)人員使用特殊的客戶端應(yīng)用程序/終端與Heroku交互,這很像Unix bash腳本。 這允許您上傳存儲(chǔ)在git存儲(chǔ)庫中的代碼,檢查正在運(yùn)行的進(jìn)程,查看日志,設(shè)置配置變量,以及更多!
為了讓我們的應(yīng)用程序在Heroku上工作,我們需要將Express Web應(yīng)用程序放入git存儲(chǔ)庫,并對(duì)package.json進(jìn)行一些小的更改。 一旦我們完成,我們可以設(shè)置一個(gè)Heroku帳戶,獲得Heroku客戶端,并使用它來安裝我們的網(wǎng)站。
這是您開始使用所需的全部概述(請(qǐng)參閱帶有節(jié)點(diǎn)的Heroku入門 .js 以獲得更全面的指南)。
Heroku與 git 源代碼版本控制系統(tǒng)緊密集成,使用它來上傳/同步對(duì)實(shí)時(shí)系統(tǒng)所做的任何更改。 它通過添加一個(gè)名為 heroku 的新Heroku"遠(yuǎn)程"存儲(chǔ)庫來指向Heroku云上的源代碼庫。 在開發(fā)過程中,您可以使用git將更改存儲(chǔ)在"主"存儲(chǔ)庫中。 當(dāng)您想部署您的網(wǎng)站時(shí),您將更改同步到Heroku存儲(chǔ)庫。
注意:如果您習(xí)慣于遵循良好的軟件開發(fā)實(shí)踐,您可能已經(jīng)在使用git或其他一些SCM系統(tǒng)。 如果你已經(jīng)有一個(gè)git存儲(chǔ)庫,那么你可以跳過這一步。
有很多方法可以使用git,但最簡單的方法之一是首先在 GitHub 上設(shè)置帳戶 ,在那里創(chuàng)建存儲(chǔ)庫,然后在本地同步它:
現(xiàn)在創(chuàng)建了存儲(chǔ)庫("repo"),我們將要在我們的本地計(jì)算機(jī)上克隆它:
git clone https://github.com/<your_git_user_id>/express-local-library.gitThis will create the repository below the current point.
cd express-local-library
最后一步是在應(yīng)用程序中復(fù)制,然后使用git將文件添加到您的repo中:
add
command to add all files to git.git add -A
> git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: ? (use "git reset HEAD <file>..." to unstage) ? ? ? ? new file: ? ...
git commit -m "First version of application moved into github"
git push origin master
當(dāng)此操作完成后,您應(yīng)該可以返回到Github上您創(chuàng)建repo的頁面,刷新頁面,并看到您的整個(gè)應(yīng)用程序現(xiàn)在已上傳。 當(dāng)文件更改時(shí),您可以使用add / commit / push循環(huán)繼續(xù)更新存儲(chǔ)庫。
提示:這是備份您的"vanilla"項(xiàng)目的好方法,雖然我們將在以下部分進(jìn)行的一些更改可能有助于在任何平臺(tái)上部署 或發(fā)展)其他可能不。
最好的方法是使用 git 來管理您的修訂版本。 使用 git ,你不僅可以回到一個(gè)特定的舊版本,但你可以保持在一個(gè)單獨(dú)的"分支"從生產(chǎn)變化和櫻桃選擇任何變化在生產(chǎn)和開發(fā)分支之間移動(dòng)。 學(xué)習(xí)Git 是非常值得的努力, 但超出了本主題的范圍。
最簡單的方法是將檔案復(fù)制到其他位置。 使用最好匹配你的git知識(shí)的方法!
本部分介紹了您需要對(duì)我們的 LocalLibrary 應(yīng)用程序進(jìn)行的更改,以使其在Heroku上運(yùn)行。
package.json 包含了解您的應(yīng)用程序依賴關(guān)系以及應(yīng)啟動(dòng)哪個(gè)文件來啟動(dòng)您的網(wǎng)站所需的一切。 Heroku檢測到此文件的存在,并將使用它來調(diào)配應(yīng)用程序環(huán)境。
在我們當(dāng)前的 package.json 中缺少的唯一有用的信息是節(jié)點(diǎn)的版本。 我們可以通過輸入命令找到我們用于開發(fā)的節(jié)點(diǎn)的版本:
>node --version v6.9.1
打開 package.json ,并將此信息添加為 engines> 節(jié)點(diǎn)部分(使用系統(tǒng)的版本號(hào))。
{ "name": "express-locallibrary-tutorial", "version": "0.0.0", "engines": { "node": "6.9.1" }, "private": true, ? ...
到目前為止,在本教程中,我們使用了一個(gè)硬編碼到 app.js 中的單個(gè)數(shù)據(jù)庫。 通常,我們希望能夠有一個(gè)不同的數(shù)據(jù)庫用于生產(chǎn)和開發(fā),所以接下來我們將修改LocalLibrary網(wǎng)站,以從操作系統(tǒng)環(huán)境(如果已定義)獲取數(shù)據(jù)庫URI,否則使用我們的開發(fā)數(shù)據(jù)庫 。
打開 app.js ,找到設(shè)置mongoDB連接變量的行。 它看起來像這樣:
var mongoDB = 'mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library';
使用 process.env.MONGODB_URI
的代碼替換該行,以獲取來自名為 MONGODB_URI
的環(huán)境變量的連接字符串(如果已設(shè)置) 而不是下面的占位符。)
var mongoDB = process.env.MONGODB_URI || 'mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library';
在我們繼續(xù)之前,讓我們?cè)俅螠y試網(wǎng)站,并確保它不受我們的任何更改的影響。
首先,我們需要獲取我們的依賴(你會(huì)記得我們沒有將 node_modules 文件夾復(fù)制到我們的git樹中)。 您可以通過在項(xiàng)目根目錄下的終端中運(yùn)行以下命令來實(shí)現(xiàn)此目的:
npm install
現(xiàn)在運(yùn)行網(wǎng)站(請(qǐng)參閱相關(guān)命令的測試路由),并檢查網(wǎng)站是否仍按預(yù)期運(yùn)行。
接下來讓我們保存我們對(duì)Github的所有更改。 在終端(在我們的倉庫里面),輸入以下命令:
git add -A git commit -m "Added files and changes required for deployment to heroku" git push origin master
我們現(xiàn)在應(yīng)該可以開始在Heroku上部署 LocalLibrary 。
要開始使用Heroku,您需要先創(chuàng)建一個(gè)帳戶(如果您已經(jīng)有帳戶并安裝了Heroku客戶端,請(qǐng)先跳過創(chuàng)建和上傳網(wǎng)站):
按照 Heroku此處的說明
客戶端安裝后,您將能夠運(yùn)行命令。 例如獲得客戶端的幫助:
heroku help
要?jiǎng)?chuàng)建應(yīng)用程序,我們?cè)诖鎯?chǔ)庫的根目錄中運(yùn)行"create"命令。 這會(huì)在我們的本地git環(huán)境中創(chuàng)建一個(gè)名為 heroku 的git遠(yuǎn)程("指向遠(yuǎn)程存儲(chǔ)庫的指針")。
heroku create
注意:如果您愿意,可以在"創(chuàng)建"后指定值來命名遠(yuǎn)程。 如果你不這樣,你會(huì)得到一個(gè)隨機(jī)的名字。 該名稱在默認(rèn)URL中使用。
然后我們可以將我們的應(yīng)用程序推送到Heroku存儲(chǔ)庫,如下所示。 這將上傳的應(yīng)用程序,獲取所有的依賴,打包在一個(gè)動(dòng)態(tài),并啟動(dòng)網(wǎng)站。
git push heroku master
如果我們幸運(yùn),該應(yīng)用程序現(xiàn)在"運(yùn)行"在網(wǎng)站上。 要打開瀏覽器并運(yùn)行新網(wǎng)站,請(qǐng)使用命令:
heroku open
注意:網(wǎng)站將使用我們的開發(fā)數(shù)據(jù)庫運(yùn)行。 創(chuàng)建一些書和其他對(duì)象,并檢查網(wǎng)站是否按照您的期望行為。 在下一節(jié)中,我們將它設(shè)置為使用我們的新數(shù)據(jù)庫。
您將記得前一節(jié)中的內(nèi)容,我們需要將NODE_ENV設(shè)置為"production",以提高性能并生成較少詳細(xì)的錯(cuò)誤消息。 我們通過輸入以下命令來執(zhí)行此操作:
>heroku config:set NODE_ENV='production' Setting NODE_ENV and restarting limitless-tor-18923... done, v13 NODE_ENV: production
我們還應(yīng)使用單獨(dú)的數(shù)據(jù)庫進(jìn)行生產(chǎn),并在 MONGODB_URI 環(huán)境變量中設(shè)置其URI。 您可以完全設(shè)置新的數(shù)據(jù)庫和數(shù)據(jù)庫用戶,因?yàn)槲覀冊(cè)瓉?/a> ,并獲取其URI。 您可以設(shè)置URI如圖所示(顯然,使用您自己的URI!)
>heroku config:set MONGODB_URI='mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production' Setting MONGODB_URI and restarting limitless-tor-18923... done, v13 MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production
您可以隨時(shí)使用 heroku config
命令檢查配置變量 - 立即嘗試:
>heroku config === limitless-tor-18923 Config Vars MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production NODE_ENV: ? ?production
Heroku會(huì)在更新變量時(shí)重新啟動(dòng)您的應(yīng)用程序。 如果你現(xiàn)在檢查主頁,它應(yīng)該顯示零值的對(duì)象計(jì)數(shù),因?yàn)樯厦娴母囊馕吨覀儸F(xiàn)在使用一個(gè)新的(空)數(shù)據(jù)庫。
Heroku使用獨(dú)立的附加組件為應(yīng)用程序提供后備服務(wù),例如電子郵件或數(shù)據(jù)庫服務(wù)。 我們不在本網(wǎng)站使用任何插件,但他們是與Heroku合作的重要組成部分,因此您可能想查看主題 add-ons"class ="external">管理加載項(xiàng)(Heroku docs)。
Heroku客戶端提供了一些調(diào)試工具:
heroku logs # Show current logs heroku logs --tail # Show current logs and keep updating with any new results heroku ps #Display dyno status
這是本教程關(guān)于在生產(chǎn)中設(shè)置快速應(yīng)用程序的結(jié)束,以及關(guān)于使用Express的一系列教程。 我們希望你發(fā)現(xiàn)它們有用。 您可以在此處查看源代碼的全面翻譯版本。
更多建議: