Express 教程第七部分:部署到生產環境

既然你已經使用 Express 建立並測試了一個示例網站,現在是時候將其部署到 Web 伺服器,以便人們可以透過公共網際網路訪問它。本頁解釋瞭如何託管 Express 專案,並概述了為生產環境做好準備所需的內容。

預備知識 完成所有之前的教程主題,包括Express 教程第六部分:使用表單
目標 瞭解在何處以及如何將 Express 應用程式部署到生產環境。

概述

一旦你的網站完成(或“足夠”完成以開始公開測試),你就需要將其託管在一個比你的個人開發計算機更公共、更容易訪問的地方。

到目前為止,你一直在開發環境中工作,使用 Express/Node 作為 Web 伺服器將你的網站共享到本地瀏覽器/網路,並使用(不安全)的開發設定執行你的網站,這些設定會暴露除錯和其他私密資訊。在外部託管網站之前,你首先需要:

  • 選擇一個用於託管 Express 應用程式的環境。
  • 對你的專案設定進行一些更改。
  • 為你的網站建立生產級別的基礎設施。

本教程提供了選擇託管站點的指南、準備 Express 應用程式進行生產的簡要概述,以及在 Railway 雲託管服務上安裝 LocalLibrary 網站的實際示例。

什麼是生產環境?

生產環境是伺服器計算機提供的環境,你將在其中執行你的網站供外部使用。該環境包括:

  • 執行網站的計算機硬體。
  • 作業系統(例如,Linux 或 Windows)。
  • 你的網站所基於的程式語言執行時和框架庫。
  • Web 伺服器基礎設施,可能包括 Web 伺服器、反向代理、負載均衡器等。
  • 你的網站所依賴的資料庫。

伺服器計算機可以位於你的場所並透過快速連結連線到網際網路,但更常見的是使用託管在“雲端”的計算機。這實際上意味著你的程式碼執行在託管公司資料中心中的某個遠端計算機(或可能是“虛擬”計算機)上。遠端伺服器通常會以一定的價格提供一定級別的計算資源(例如,CPU、RAM、儲存記憶體等)和網際網路連線。

這種遠端可訪問的計算/網路硬體被稱為 基礎設施即服務 (IaaS)。許多 IaaS 供應商提供預安裝特定作業系統的選項,你必須在其上安裝生產環境的其他元件。其他供應商允許你選擇功能更完整的環境,可能包括完整的 Node 設定。

注意:預構建的環境可以簡化你的網站設定,因為它們減少了所需的配置,但可用的選項可能會將你限制在不熟悉的伺服器(或其他元件)上,並且可能基於較舊的作業系統版本。通常,最好自己安裝元件,這樣你就可以獲得想要的元件,並且當需要升級系統部件時,你對從何開始有一些瞭解!

其他託管服務提供商支援 Express 作為 平臺即服務 (PaaS) 產品的一部分。使用這種託管方式時,你無需擔心大部分生產環境(伺服器、負載均衡器等),因為主機平臺會為你處理這些。這使得部署非常簡單,因為你只需專注於你的 Web 應用程式,而無需關注任何其他伺服器基礎設施。

一些開發人員會選擇 IaaS 提供的更大靈活性,而不是 PaaS,而另一些開發人員則會欣賞 PaaS 減少的維護開銷和擴充套件工作。當你剛開始時,在 PaaS 系統上設定你的網站要容易得多,所以這就是我們將在本教程中做的。

注意:如果你選擇一個對 Node/Express 友好的託管服務提供商,他們應該提供關於如何使用不同配置的 Web 伺服器、應用程式伺服器、反向代理等設定 Express 網站的說明。例如,在 DigitalOcean Node 社群文件中,有許多針對各種配置的逐步指南。

選擇託管服務提供商

有許多託管服務提供商已知要麼積極支援要麼與 Node(和 Express)配合良好。這些供應商提供不同型別的環境 (IaaS, PaaS),以及不同級別和價格的計算和網路資源。

注意:託管解決方案有很多,它們的服務和定價可能會隨時間變化。雖然我們在下面介紹了一些選項,但在選擇託管服務提供商之前,值得檢查這些選項以及其他選項。

選擇主機時需要考慮的一些事項:

  • 你的網站可能有多繁忙,以及滿足該需求所需的資料和計算資源的成本。
  • 水平擴充套件(新增更多機器)和垂直擴充套件(升級到更強大的機器)的支援級別以及這樣做的成本。
  • 供應商擁有資料中心的地理位置,以及因此訪問速度可能最快的地方。
  • 主機的歷史正常執行時間 (uptime) 和停機時間 (downtime) 效能。
  • 提供的網站管理工具——它們是否易於使用且安全(例如,SFTP 與 FTP)。
  • 內建的伺服器監控框架。
  • 已知限制。一些主機將故意阻止某些服務(例如,電子郵件)。其他主機只在某些價格層級提供一定小時數的“即時執行時間”,或只提供少量儲存空間。
  • 額外的好處。一些提供商將提供免費域名和對 TLS 證書的支援,否則你將不得不為此付費。
  • 你所依賴的“免費”層級是否會隨時間到期,以及遷移到更昂貴的層級的成本是否意味著你最初使用其他服務會更好!

當你剛開始時,好訊息是,有相當多的網站提供用於評估和測試的“免費”計算環境。這些通常是資源相當受限的環境,你需要注意它們可能會在介紹期後過期或有其他限制。然而,它們非常適合在託管環境中測試低流量網站,並且當你的網站變得更繁忙時,可以輕鬆遷移到支付更多資源。這類流行的選擇包括 Amazon Web ServicesMicrosoft Azure

大多數提供商還提供“基本”或“業餘”層級,旨在用於小型生產網站,並提供更有用的計算能力和更少的限制。RailwayHerokuDigitalOcean 是流行託管提供商的示例,它們具有相對便宜的基本計算層級(每月 5 到 10 美元左右)。

注意:請記住,價格不是唯一的選擇標準。如果你的網站成功,可擴充套件性可能才是最重要的考慮因素。

讓你的網站準備好釋出

釋出網站時要考慮的主要事項是網路安全和效能。最起碼,你需要修改資料庫配置,以便在生產環境中使用不同的資料庫並保護其憑據,刪除開發期間錯誤頁面中包含的堆疊跟蹤,整理日誌,並設定適當的標頭以避免許多常見的安全威脅。

在以下小節中,我們概述了你應該對應用程式進行的最重要的更改。

注意:Express 文件中還有其他有用的提示——請參閱 生產最佳實踐:效能和可靠性生產最佳實踐:安全性

資料庫配置

到目前為止,在本教程中,我們使用了一個單一的開發資料庫,其地址和憑據被硬編碼到 bin/www。由於開發資料庫不包含我們介意暴露或損壞的任何資訊,因此洩露這些詳細資訊沒有特別的風險。但是,如果你正在處理真實資料,尤其是個人使用者資訊,那麼保護你的資料庫憑據就非常重要。

因此,我們希望為生產環境使用與開發環境不同的資料庫,並且將生產資料庫憑據與原始碼分開,以便可以對其進行適當的保護。

如果你的託管服務提供商支援透過 Web 介面設定環境變數(許多提供商都支援),一種方法是讓伺服器從環境變數獲取資料庫 URL。下面我們修改 LocalLibrary 網站,如果已定義,則從 OS 環境變數獲取資料庫 URI,否則使用開發資料庫 URL。

開啟 bin.www 並找到設定 MongoDB 連線變數的行。它看起來像這樣:

js
const mongoDB =
  "mongodb+srv://your_user_name:your_password@cluster0.cojoign.mongodb.net/local_library?retryWrites=true&w=majority";

將該行替換為以下程式碼,該程式碼使用 process.env.MONGODB_URI 從名為 MONGODB_URI 的環境變數獲取連線字串(如果已設定)(使用你自己的資料庫 URL 替換下面的佔位符)。

js
const dev_db_url =
  "mongodb+srv://your_user_name:your_password@cluster0.cojoign.mongodb.net/local_library?retryWrites=true&w=majority";
const mongoDB = process.env.MONGODB_URI || dev_db_url;

注意:將生產資料庫憑據與原始碼分開的另一種常見方法是從單獨部署到檔案系統的 .env 檔案中讀取它們(例如,它們可能使用 npm 的 dotenv 模組讀取)。

將 NODE_ENV 設定為 'production'

我們可以透過將 NODE_ENV 環境變數設定為 *production* 來刪除錯誤頁面中的堆疊跟蹤(預設設定為 'development')。除了生成不那麼冗長的錯誤訊息外,將變數設定為 *production* 還會快取檢視模板和從 CSS 擴充套件生成的 CSS 檔案。測試表明,將 NODE_ENV 設定為 *production* 可以將應用程式效能提高三倍!

此更改可以透過使用 export、環境檔案或作業系統初始化系統進行。

注意:這實際上是你在環境設定而不是應用程式中進行的更改,但此處值得注意!我們將在下面的託管示例中展示如何進行此設定。

適當記錄

日誌呼叫可能會對高流量網站產生影響。在生產環境中,你可能需要記錄網站活動(例如,跟蹤流量或記錄 API 呼叫),但你應該嘗試最小化為除錯目的新增的日誌量。

在生產環境中最小化“除錯”日誌記錄的一種方法是使用像 debug 這樣的模組,它允許你透過設定環境變數來控制執行的日誌記錄。例如,下面的程式碼片段顯示了你如何設定“author”日誌記錄。debug 變數宣告為“author”,並且所有來自此物件的日誌都將自動顯示字首“author”。

js
const debug = require("debug")("author");

// Display Author update form on GET.
exports.author_update_get = async (req, res, next) => {
  const author = await Author.findById(req.params.id).exec();
  if (author === null) {
    // No results.
    debug(`id not found on update: ${req.params.id}`);
    const err = new Error("Author not found");
    err.status = 404;
    return next(err);
  }

  res.render("author_form", { title: "Update Author", author });
};

然後,你可以透過在 DEBUG 環境變數中將其指定為逗號分隔列表來啟用一組特定的日誌。你可以設定用於顯示作者和書籍日誌的變數,如下所示(也支援萬用字元)。

bash
#Windows
set DEBUG=author,book

#Linux
export DEBUG="author,book"

注意:debug 的呼叫可以替換你以前使用 console.log()console.error() 進行的日誌記錄。將程式碼中所有 console.log() 呼叫替換為透過 debug 模組進行的日誌記錄。透過設定 DEBUG 變數在開發環境中開啟和關閉日誌記錄,並觀察這對日誌記錄的影響。

如果你需要記錄網站活動,可以使用 WinstonBunyan 等日誌庫。有關此主題的更多資訊,請參閱:生產最佳實踐:效能和可靠性

對響應使用 gzip/deflate 壓縮

Web 伺服器通常可以壓縮傳送回客戶端的 HTTP 響應,從而顯著減少客戶端獲取和載入頁面所需的時間。使用的壓縮方法將取決於客戶端在請求中聲稱支援的解壓縮方法(如果不支援任何壓縮方法,響應將未壓縮傳送)。

使用 compression 中介軟體將此功能新增到你的網站。透過執行以下命令在專案根目錄安裝此中介軟體:

bash
npm install compression

開啟 ./app.js 並按所示要求壓縮庫。使用 use() 方法將壓縮庫新增到中介軟體鏈中(這應該出現在任何你想壓縮的路由之前——在這種情況下,是所有路由!)

js
const catalogRouter = require("./routes/catalog"); // Import routes for "catalog" area of site
const compression = require("compression");

// Create the Express application object
const app = express();

// …

app.use(compression()); // Compress all routes

app.use(express.static(path.join(__dirname, "public")));

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/catalog", catalogRouter); // Add catalog routes to middleware chain.

// …

注意:對於生產中的高流量網站,你不會使用此中介軟體。相反,你會使用像 Nginx 這樣的反向代理。

使用 Helmet 防禦已知漏洞

Helmet 是一箇中間件包。它可以設定適當的 HTTP 標頭,幫助保護你的應用程式免受已知 Web 漏洞的侵害(有關它設定的標頭和防禦的漏洞的更多資訊,請參閱文件)。

透過執行以下命令在專案根目錄安裝此中介軟體:

bash
npm install helmet

開啟 ./app.js 並按所示要求 helmet 庫。然後使用 use() 方法將模組新增到中介軟體鏈中。

js
const compression = require("compression");
const helmet = require("helmet");

// Create the Express application object
const app = express();

// Add helmet to the middleware chain.
// Set CSP headers to allow our Bootstrap and jQuery to be served
app.use(
  helmet.contentSecurityPolicy({
    directives: {
      "script-src": ["'self'", "cdn.jsdelivr.net"],
    },
  }),
);

// …

我們通常可能只插入 app.use(helmet()); 來新增對大多數網站有意義的安全相關標頭子集。然而,在 LocalLibrary 基本模板中,我們包含了一些引導指令碼。這些指令碼違反了 Helmet 的預設 內容安全策略 (CSP),該策略不允許載入跨站指令碼。為了允許載入這些指令碼,我們修改了 Helmet 配置,使其設定 CSP 指令以允許從指定域載入指令碼。對於你自己的伺服器,你可以根據需要新增/停用特定標頭,方法是遵循此處使用 Helmet 的說明

向 API 路由新增速率限制

Express-rate-limit 是一箇中間件包,可用於限制對 API 和端點的重複請求。過度請求你的網站的原因有很多,例如拒絕服務攻擊、暴力破解攻擊,甚至是行為不正常的客戶端或指令碼。除了由於請求過多導致伺服器變慢而可能出現的效能問題外,你還可能因為額外的流量而被收費。此包可用於限制對特定路由或一組路由的請求數量。

透過執行以下命令在專案根目錄安裝此中介軟體:

bash
npm install express-rate-limit

開啟 ./app.js 並按所示要求 express-rate-limit 庫。然後使用 use() 方法將模組新增到中介軟體鏈中。

js
const compression = require("compression");
const helmet = require("helmet");
const RateLimit = require("express-rate-limit");

const app = express();

// Set up rate limiter: maximum of twenty requests per minute
const limiter = RateLimit({
  windowMs: 1 * 60 * 1000, // 1 minute
  max: 20,
});
// Apply rate limiter to all requests
app.use(limiter);

// …

以上命令將所有請求限制為每分鐘 20 次(你可以根據需要更改)。

注意:如果需要更高階的防禦拒絕服務或其他型別的攻擊,也可以使用像 Cloudflare 這樣的第三方服務。

設定 Node 版本

對於 Node 應用程式,包括 Express,package.json 檔案包含了託管服務提供商應需要了解的所有應用程式依賴項和入口檔案。

我們當前 package.json 中唯一缺少的重要資訊是庫所需的 Node 版本。你可以透過輸入以下命令找到開發時使用的 Node 版本:

bash
>node --version
v16.17.1

開啟 package.json,並按所示將此資訊新增為 engines > node(使用你係統的版本號)。

json
{
  "engines": {
    "node": ">=22.0.0"
  }
}

託管服務可能不支援指定的特定 Node 版本,但此更改應確保它嘗試使用相同主要版本號或更新版本的版本。

請注意,在不同的託管服務上可能還有其他指定 Node 版本的方法,但 package.json 方法得到了廣泛支援。

獲取依賴項並重新測試

在我們繼續之前,讓我們再次測試網站,確保它沒有受到我們任何更改的影響。

首先,我們需要獲取我們的依賴項。你可以在專案根目錄的終端中執行以下命令來完成此操作:

bash
npm install

現在執行網站(請參閱測試路由以獲取相關命令)並檢查網站行為是否仍符合你的預期。

在 GitHub 中建立應用程式倉庫

許多託管服務允許你從本地倉庫或基於雲的原始碼版本控制平臺匯入和/或同步專案。這可以使部署和迭代開發變得更加容易。

在本教程中,我們將為庫設定一個 GitHub 帳戶和倉庫,並使用 git 工具上傳我們的原始碼。

注意:如果你已經使用 GitHub 管理你的原始碼,則可以跳過此步驟!

請注意,使用原始碼管理工具是良好的軟體開發實踐,因為它允許你嘗試更改,並在需要時在你的實驗和“已知良好程式碼”之間切換!

步驟如下:

  1. 訪問 https://github.com/ 並建立一個帳戶。

  2. 登入後,單擊頂部工具欄中的 + 連結,然後選擇 New repository

  3. 填寫此表單中的所有欄位。雖然這些不是強制性的,但強烈建議填寫。

    • 輸入新的倉庫名稱(例如,express-locallibrary-tutorial)和描述(例如,“用 Express 編寫的本地圖書館網站”)。
    • Add .gitignore 選擇列表中選擇 Node
    • Add license 選擇列表中選擇你偏好的許可證。
    • 勾選 Initialize this repository with a README

    警告:預設的“公共”訪問將使所有原始碼——包括你的資料庫使用者名稱和密碼——對網際網路上的任何人可見!請確保原始碼從環境變數中讀取憑據,並且沒有任何硬編碼的憑據。

    否則,選擇“私有”選項以僅允許選定的人檢視原始碼。

  4. Create repository

  5. 點選新倉庫頁面上的綠色 Clone or download 按鈕。

  6. 從出現的對話方塊中的文字欄位複製 URL 值。如果你使用倉庫名稱“express-locallibrary-tutorial”,則 URL 應該類似於:https://github.com/<your_git_user_id>/express-locallibrary-tutorial.git

現在倉庫(“repo”)已在 GitHub 上建立,我們將要將其克隆(複製)到本地計算機

  1. 為你的本地計算機安裝 git官方 Git 下載指南)。

  2. 開啟命令提示符/終端並使用你上面複製的 URL 克隆你的倉庫:

    bash
    git clone https://github.com/<your_git_user_id>/express-locallibrary-tutorial.git
    

    這將在當前目錄中建立倉庫。

  3. 導航到倉庫資料夾。

    bash
    cd express-locallibrary-tutorial
    

然後將你的應用程式原始檔複製到倉庫資料夾中,使用 git 將它們作為倉庫的一部分,並將它們上傳到 GitHub:

  1. 將你的 Express 應用程式複製到此資料夾中(不包括 /node_modules,其中包含你應該根據需要從 npm 獲取的依賴檔案)。

  2. 開啟命令提示符/終端並使用 add 命令將所有檔案新增到 git。

    bash
    git add -A
    
  3. 使用 status 命令檢查你即將 commit 的所有檔案是否正確(你希望包含原始檔,而不是二進位制檔案、臨時檔案等)。它應該看起來有點像下面的列表。

    bash
    git status
    
    On branch main
    Your branch is up-to-date with 'origin/main'.
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            new file:   ...
    
  4. 當你滿意時,將檔案 commit 到你的本地倉庫。這相當於簽署更改並使其成為本地倉庫的官方部分。

    bash
    git commit -m "First version of application moved into GitHub"
    
  5. 此時,遠端倉庫尚未更改。最後一步是使用以下命令將你的本地倉庫同步 (push) 到遠端 GitHub 倉庫:

    bash
    git push origin main
    

當此操作完成時,你應該能夠返回到你在 GitHub 上建立倉庫的頁面,重新整理頁面,然後看到你的整個應用程式已上傳。你可以使用這種新增/提交/推送迴圈在檔案更改時繼續更新你的倉庫。

這是備份你的“原始”專案的好時機——雖然我們將在以下部分中進行的一些更改可能對任何託管服務(或用於開發)有用,但其他更改可能不適用。你可以使用命令列上的 git 來完成此操作:

bash
# Create branch vanilla_deployment from the current branch (main)
git checkout -b vanilla_deployment

# Push the new branch to GitHub
git push origin vanilla_deployment

# Switch back to main
git checkout main

# Make any further changes in a new branch
git pull upstream main # Merge the latest changes from GitHub
git checkout -b my_changes # Create a new branch

注意:Git 非常強大!要了解更多資訊,請參閱 學習 Git

示例:在 Railway 上託管

本節提供瞭如何在 Railway 上安裝 LocalLibrary 的實際演示。

注意:MDN 已將此專案從許多不再提供免費層的託管服務遷移。我們已決定使用 Railway 作為當前的託管選項,它有一個廉價的愛好層級。大多數服務都有類似的部署方法,因此以下說明應該能幫助你在你選擇的平臺上釋出你的專案。

為什麼選擇 Railway?

Railway 是一個有吸引力的託管選項,原因有以下幾點:

  • Railway 負責大部分基礎設施,因此你無需擔心。無需擔心伺服器、負載均衡器、反向代理等,這使得入門變得容易得多。
  • Railway 專注於開發和部署的開發者體驗,這使得學習曲線比許多其他替代方案更快、更平緩。
  • 你使用 Railway 時學到的技能和概念是可轉移的。雖然 Railway 有一些出色的新功能,但其他流行的託管服務也使用許多相同的思想和方法。
  • Railway 文件清晰而完整。
  • 它有一個相對便宜的業餘層級
  • 該服務似乎非常可靠,如果你最終喜歡它,定價是可預測的,並且擴充套件你的應用程式非常容易。

你應該花時間確定 Railway 是否適合你自己的網站

Railway 如何工作?

Web 應用程式各自執行在自己獨立隔離的虛擬化容器中。為了執行你的應用程式,Railway 需要能夠設定適當的環境和依賴項,並且還需要了解它是如何啟動的。

Railway 使這變得容易,因為它可以根據“通用約定”的使用自動識別和安裝許多不同的 Web 應用程式框架和環境。例如,Railway 識別 Node 應用程式是因為它們有一個 package.json 檔案,並且可以從“鎖”檔案中確定用於構建的包管理器。例如,如果應用程式包含檔案 package-lock.json,Railway 知道使用 npm 來安裝包,而如果它找到 yarn.lock,它知道使用 yarn。安裝所有依賴項後,Railway 將在包檔案中查詢名為“build”和“start”的指令碼,並使用它們來構建和執行程式碼。

注意:Railway 使用 Nixpacks 來識別用不同程式語言編寫的各種 Web 應用程式框架。本教程不需要了解其他任何內容,但你可以在 Nixpacks Node 中找到更多關於部署 Node 應用程式的選項。

應用程式執行後,它可以使用 環境變數中提供的資訊進行自我配置。例如,使用資料庫的應用程式必須使用變數獲取地址。資料庫服務本身可以由 Railway 或其他提供商託管。

開發人員透過 Railway 網站以及使用特殊的 命令列介面 (CLI) 工具與 Railway 互動。CLI 允許你將本地 GitHub 倉庫與 Railway 專案關聯起來,將本地分支的倉庫上傳到即時站點,檢查執行程序的日誌,設定和獲取配置變數等等。最有用的功能之一是你可以使用 CLI 在與即時專案相同的環境變數下執行本地專案。

這就是將應用程式部署到 Railway 所需的全部概述。接下來,我們將設定一個 Railway 帳戶,安裝我們的網站和資料庫,並試用 Railway 客戶端。

獲取 Railway 帳戶

要開始使用 Railway,你首先需要建立一個帳戶:

  • 訪問 railway.com 並單擊頂部工具欄中的 Login 連結。
  • 在彈出視窗中選擇 GitHub 以使用你的 GitHub 憑據登入。
  • 然後你可能需要前往你的電子郵件並驗證你的帳戶。
  • 然後你將登入到 Railway.com 控制檯:https://railway.com/dashboard

從 GitHub 部署到 Railway

接下來,我們將設定 Railway 以從 GitHub 部署我們的庫。首先從網站頂部選單中選擇 Dashboard 選項,然後選擇 New Project 按鈕。

Railway website dashboard showing new project button

Railway 將顯示新專案的選項列表,包括從 GitHub 帳戶中首次建立的模板部署專案的選項,以及許多資料庫。選擇 Deploy from GitHub repo

Railway popup showing deployment options with Deploy from GitHub repo option highlighted

顯示你在設定期間與 Railway 共享的所有 GitHub 倉庫中的專案。選擇你的本地庫的 GitHub 倉庫:<user-name>/express-locallibrary-tutorial

Railway popup showing GitHub repos that can be deployed

透過選擇 Deploy Now 確認部署。

Confirmation screen when you can select deployment of project

Railway 然後將載入並部署你的專案,並在部署選項卡上顯示進度。當部署成功完成時,你將看到如下螢幕。

Railway dashboard showing Deployments tab for the deployed project

現在選擇“設定”選項卡,然後向下滾動到“域”部分,然後按“生成域”按鈕。

Railway project settings tab showing button to generate a domain

這將釋出網站並將域名取代按鈕的位置,如下圖所示。

Railway project settings tab showing a link to the local library site

選擇域 URL 以開啟你的庫應用程式。請注意,由於我們沒有指定生產資料庫,因此本地庫將使用你的開發資料開啟。

配置並連線 MongoDB 資料庫

接下來,我們將建立一個生產 MongoDB 資料庫來替代我們的開發資料。我們將把資料庫作為 Railway 應用程式專案的一部分建立,儘管你也可以將其建立在自己的獨立專案中,或者使用 MongoDB Atlas 資料庫作為生產資料,就像你為開發資料庫所做的那樣。

在 Railway 上,從網站頂部選單中選擇 Dashboard 選項,然後選擇你的應用程式專案。在此階段,它只包含你的應用程式的單個服務(可以選擇此服務來設定變數和服務的其他詳細資訊)。選擇 New 按鈕,該按鈕用於向當前專案新增服務。

Railway project with new service button highlighted

當提示服務型別時,選擇 Database

Railway popup showing options for a new service, such as database, GitHub repo, empty service etc

然後選擇 Add MongoDB 開始新增資料庫。

Railway popup showing different databases that can be selected: Postgres, MySQL, MongoDB and so on

Railway 將在同一專案中配置一個包含空資料庫的服務。完成後,你現在將在專案檢視中看到應用程式和資料庫服務。

Railway project with application and database services

選擇 MongoDB 服務以顯示有關資料庫的資訊。開啟“變數”選項卡並複製“Mongo_URL”(這是資料庫的地址)。

Railway database settings screen showing the URL needed to connect to the database

為了讓庫應用程式能夠訪問它,我們需要使用環境變數將其新增到應用程式程序中。首先開啟應用程式服務。然後選擇“變數”選項卡,然後按“新建變數”按鈕。

輸入變數名 MONGODB_URI 和你為資料庫複製的連線 URL(MONGODB_URI 是我們配置應用程式以讀取資料庫地址的環境變數的名稱)。這看起來會像下面顯示的螢幕。

Railway website variables screen while adding the MONGODB_URI variable and address

選擇 Add 以新增變數。

Railway 在更新變數時會重新啟動你的應用程式。如果你現在檢查主頁,它應該顯示物件計數為零,因為上面的更改意味著我們現在正在使用一個新的(空的)資料庫。

其他配置變數

你會記得在前面的部分中,我們需要將 NODE_ENV 設定為 'production' 以提高效能並生成不那麼冗長的錯誤訊息。我們可以在設定 MONGODB_URI 變數的同一螢幕中完成此操作。

開啟應用程式服務。然後選擇“變數”選項卡,在那裡你會看到 MONGODB_URI 已經定義,然後按“新建變數”按鈕。

Railway variables tab with the New Variable button highlighted

輸入 NODE_ENV 作為新變數的名稱,並輸入 production 作為環境的名稱。然後按 Add 按鈕。

Railway variables tab with new NODE_ENV variable being set to 'production'

本地圖書館應用程式現在已設定並配置為生產用途。你可以透過網站介面新增資料,它應該以與開發期間相同的方式工作(儘管對於無效頁面暴露的除錯資訊更少)。

注意:如果你只想新增一些資料進行測試,你可能會使用 populatedb 指令碼(以及你的 MongoDB 生產資料庫 URL),如Express 教程第三部分:使用資料庫(與 Mongoose)測試 — 建立一些專案中所述。

安裝客戶端

按照此處的說明下載併為你的本地作業系統安裝 Railway 客戶端。

安裝客戶端後,你將能夠執行命令。一些更重要的操作包括將計算機的當前目錄部署到關聯的 Railway 專案(無需上傳到 GitHub),以及使用與生產伺服器相同的設定在本地執行你的專案。

你可以在終端中輸入以下命令獲取所有可能命令的列表。

bash
railway help

除錯

Railway 客戶端提供了 logs 命令來顯示日誌的尾部(每個專案的更完整日誌可在網站上獲取)

bash
railway logs

總結

關於在生產環境中設定 Express 應用程式的本教程到此結束,也是關於使用 Express 的系列教程的結束。希望你覺得它們有用。你可以在 GitHub 上檢視完整的原始碼

另見