使用Express在5分鐘內建立和部署Node.js應用程式

使用Express在5分鐘內建立和部署Node.js應用程式

Express 是世界上使用最多的 Node.js 框架,它使開發人員能夠使用 JavaScript 建立後端網路伺服器。該框架提供了後端開發人員所需的大部分功能,簡化了路由和響應 Web 請求的過程。

我們已經為你準備了一份關於 Express.js 的指南,所以這篇實踐文章將向你展示如何使用它。本教程介紹如何使用 Express.js 建立和部署一個 Node.js 應用程式示例。

如何使用 Express.js 快速建立應用程式

本教程演示瞭如何建立一個網路應用程式,該程式可以接收對端點的請求,使用請求中的引數呼叫資料庫,並以 JSON 格式從資料庫返回資訊。

前提條件

要學習本教程,請確保您的計算機上安裝了以下工具:

Express 應用程式生成器

您可以使用我們的 Express.js 指南中概述的流程將 Express 新增到現有的 Node 應用程式中,但如果您要從頭開始,還有一個更快捷的選擇:Express 生成器

來自 Express.js 的官方 Express 生成器是一個 Node 包,它允許你生成一個新的應用程式骨架。首先為您的應用程式建立一個資料夾,然後執行 npx 命令(Node.js 8.2.0 中提供)即可完成生成:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mkdir express-application
npx express-generator
mkdir express-application npx express-generator
mkdir express-application
npx express-generator

成功生成後,終端會顯示建立的資料夾/檔案列表,以及安裝依賴項和執行應用程式的命令。執行以下命令安裝依賴項:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install
npm install
npm install

接下來,啟動網路伺服器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
DEBUG=myapp:* npm start
DEBUG=myapp:* npm start
DEBUG=myapp:* npm start

骨架應用程式有一個預建的索引路由,可渲染一個基本主頁。你可以訪問 localhost:3000 在瀏覽器中檢視。

探索骨架 Express 應用程式

在首選程式碼編輯器中開啟 Express 應用程式後,你會發現一個基本結構構成了網路應用程式的骨架。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/
|-- /node_modules
|-- /public
|-- /routes
|-- index.js
|-- users.js
|-- /views
|-- error.jade
|-- index.jade
|-- layout.jade
|-- app.js
|-- package.json
/ |-- /node_modules |-- /public |-- /routes |-- index.js |-- users.js |-- /views |-- error.jade |-- index.jade |-- layout.jade |-- app.js |-- package.json
/
|-- /node_modules
|-- /public
|-- /routes
|-- index.js
|-- users.js
|-- /views
|-- error.jade
|-- index.jade
|-- layout.jade
|-- app.js
|-- package.json
  • node_modules:此目錄儲存專案的所有已安裝依賴項和庫。
  • public:包含 CSS、JavaScript、圖片等靜態資產。這些檔案將直接提供給客戶端瀏覽器。
  • routes:包含負責定義各種路由和處理來自不同 URL 的請求的檔案。
  • views:包含伺服器渲染以建立使用者介面的模板或檢視。這裡的 error.jadeindex.jadelayout.jade 是用 Jade 模板語言編寫的模板。它們有助於結構化並向使用者呈現動態內容。
  • app.js:該檔案通常作為 Express 應用程式的入口點。在這裡配置伺服器、設定中介軟體、定義路由以及處理請求和響應。
  • package.json:該檔案包含應用程式的後設資料。它有助於管理依賴關係和專案配置。

瞭解路由處理

在 Express 應用程式中,routes 目錄是將路由定義為獨立檔案的地方。主要路由通常稱為索引路由,位於 routes/index.js 檔案中。

該索引路由處理 GET 請求,並以框架生成的 HTML 網頁作為響應。下面的程式碼片段說明了如何處理 GET 請求,以呈現一個基本的歡迎頁面:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;

如果將 res.render() 函式修改為 res.send() ,響應型別就會從 HTML 變為 JSON:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.send({ key: 'value' });
});
module.exports = router;
var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.send({ key: 'value' }); }); module.exports = router;
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.send({ key: 'value' });
});
module.exports = router;

為了擴充套件功能,在同一檔案中新增了另一個路由,引入了一個接受引數的新端點。該程式碼片段演示了應用程式如何處理不同端點上的流量、提取引數並以 JSON 格式響應其值:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/* GET a new resource */
router.get('/newEndpoint', function(req, res, next) {
res.send({ yourParam: req.query.someParam });
});
/* GET a new resource */ router.get('/newEndpoint', function(req, res, next) { res.send({ yourParam: req.query.someParam }); });
/* GET a new resource */
router.get('/newEndpoint', function(req, res, next) {
res.send({ yourParam: req.query.someParam });
});

localhost:3000/newEndpoint?someParam=whatever 傳送 GET 請求,將產生包含字串 “whatever” 的 JSON 輸出。

在 Postman 中向本地執行的應用程式發出 GET 請求

在 Postman 中向本地執行的應用程式發出 GET 請求。

注:必須重新啟動網路伺服器才能有效執行新的更改。

Express 和 Kinsta 應用程式託管

從你的電腦向你的電腦發出網路請求固然不錯,但只有離開本地主機,網路開發才算完成。幸運的是,即使需要資料庫,Kinsta 也能讓應用程式輕鬆部署到網路上。

現在,讓我們通過整合資料庫功能,並將應用程式和資料庫部署到網路上,實現從任何計算機訪問,來深入探討如何擴充套件應用程式的功能。

在將 Express 應用程式部署到 Kinsta 的應用程式託管服務之前,將應用程式的程式碼和檔案推送到您選擇的 Git 提供商(BitbucketGitHubGitLab)至關重要。確保在應用程式根目錄建立 .gitignore 檔案幷包含 node_modules ,以防止將這些檔案推送到 Git 提供商。

設定好倉庫後,請按照以下步驟將 Express 應用程式部署到 Kinsta:

  1. 登入或建立賬戶,檢視 MyKinsta 面板。
  2. 通過 Git 提供商授權 Kinsta。
  3. 單擊左側邊欄上的 Applications ,然後單擊 Add application
  4. 選擇要部署的版本庫和分支。
  5. 為應用程式指定一個唯一的名稱,並選擇 Data center location
  6. 接下來配置構建環境。選擇標 Standard build machine,併為該演示選擇推薦的 Nixpacks 選項。
  7. 使用所有預設配置,然後單擊 “Create application“。

Kinsta 可與 Express 應用程式生成器配合使用!完成這些步驟後,應用程式將自動開始構建和部署過程。

部署介面將提供 Kinsta 部署應用程式的 URL。您可以新增 /newEndpoint?someParam=whatever 來測試本文前一部分中構建的端點。

如何在 Express 應用程式中新增資料庫

對於大多數生產級應用程式來說,擁有一個資料庫是必不可少的。

下面介紹如何在 Kinsta 上建立資料庫:

1. 導航到 MyKinsta 面板側邊欄上的 Databases 部分。

2. 單擊 Create a database。輸入名稱並選擇資料庫型別,配置資料庫詳細資訊。

3. 選擇 PostgreSQL 選項。Database usernamepassword 將自動生成:

 

新增新資料庫的 MyKinsta 資料庫配置步驟

新增新資料庫的 MyKinsta 資料庫配置步驟。

4. 選擇與託管 Express 應用程式相同的 Data center location,並配置所需的大小。

5. 確認付款資訊並單擊 Create database

成功建立資料庫後:

  1. 點選訪問資料庫詳細資訊。在 “Overview” 頁面中,導航至 “Internal connections” 部分。
  2. 選擇適當的應用程式。
  3. 選中 Add environment variables to the application 選項。
  4. 單擊 Add connection,連線新建立的資料庫和應用程式。

接下來,複製新建立資料庫的連線字串,用資料庫工具連線資料庫。任何 SQL 連線工具都可以,但本演示使用的是 Beekeeper。開啟應用程式,點選從 URL 匯入,貼上連線字串,然後點選匯入。這樣就可以在剛剛建立的 Kinsta 託管資料庫上執行 SQL。

接下來,使用資料庫工具對託管資料庫執行一些 SQL 語句,建立一個只有一個條目的基本表:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CREATE TABLE "States"
( id integer CONSTRAINT states_pk PRIMARY KEY,
state_name varchar(100),
capital varchar(100),
state_bird varchar(100),
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO "States"
VALUES(1, 'ohio', 'columbus', 'cardinal');
CREATE TABLE "States" ( id integer CONSTRAINT states_pk PRIMARY KEY, state_name varchar(100), capital varchar(100), state_bird varchar(100), "createdAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(), "updatedAt" TIMESTAMPTZ NOT NULL DEFAULT NOW() ); INSERT INTO "States" VALUES(1, 'ohio', 'columbus', 'cardinal');
CREATE TABLE "States"
( id integer CONSTRAINT states_pk PRIMARY KEY,
state_name varchar(100),
capital varchar(100),
state_bird varchar(100),
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT NOW(),
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO "States"
VALUES(1, 'ohio', 'columbus', 'cardinal');

將以下資料庫軟體包新增到專案中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install sequelize pg
npm install sequelize pg
npm install sequelize pg

sequelize 依賴項是 Node.js 的 ORM,而 pg 則作為 PostgreSQL 客戶端,實現 Node.js 應用程式與 PostgreSQL 資料庫之間的互動。

接下來,編寫應用程式碼,接受帶有 id 引數的 GET 請求,並返回與該 id 相關聯的資料庫資訊。為此,請相應修改  index.js 檔案:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var express = require('express');
var router = express.Router();
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.CONNECTION_URI, {
dialect: 'postgres',
protocol: 'postgres',
});
const State = sequelize.define('State', {
// Model attributes are defined here
state_name: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
capital: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
state_bird: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
}, {
// Other model options go here
});
async function connectToDB() {
try {
sequelize.authenticate().then(async () => {
// await State.sync({ alter: true });
})
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
}
connectToDB();
/* GET a new resource */
router.get('/state', async function(req, res, next) {
const state = await State.findByPk(req.query.id);
if (state) {
res.send(state)
} else {
res.status(404).send("state not found");
}
});
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
/* GET a new resource */
router.get('/newEndpoint', function(req, res, next) {
res.send({ yourParam: req.query.someParam });
});
module.exports = router;
var express = require('express'); var router = express.Router(); const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize(process.env.CONNECTION_URI, { dialect: 'postgres', protocol: 'postgres', }); const State = sequelize.define('State', { // Model attributes are defined here state_name: { type: DataTypes.STRING, allowNull: true, unique: false }, capital: { type: DataTypes.STRING, allowNull: true, unique: false }, state_bird: { type: DataTypes.STRING, allowNull: true, unique: false }, }, { // Other model options go here }); async function connectToDB() { try { sequelize.authenticate().then(async () => { // await State.sync({ alter: true }); }) console.log('Connection has been established successfully.'); } catch (error) { console.error('Unable to connect to the database:', error); } } connectToDB(); /* GET a new resource */ router.get('/state', async function(req, res, next) { const state = await State.findByPk(req.query.id); if (state) { res.send(state) } else { res.status(404).send("state not found"); } }); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); /* GET a new resource */ router.get('/newEndpoint', function(req, res, next) { res.send({ yourParam: req.query.someParam }); }); module.exports = router;
var express = require('express');
var router = express.Router();
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(process.env.CONNECTION_URI, {
dialect: 'postgres',
protocol: 'postgres',
});
const State = sequelize.define('State', {
// Model attributes are defined here
state_name: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
capital: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
state_bird: {
type: DataTypes.STRING,
allowNull: true,
unique: false
},
}, {
// Other model options go here
});
async function connectToDB() {
try {
sequelize.authenticate().then(async () => {
// await State.sync({ alter: true });
})
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
}
connectToDB();
/* GET a new resource */
router.get('/state', async function(req, res, next) {
const state = await State.findByPk(req.query.id);
if (state) {
res.send(state)
} else {
res.status(404).send("state not found");
}
});
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
/* GET a new resource */
router.get('/newEndpoint', function(req, res, next) {
res.send({ yourParam: req.query.someParam });
});
module.exports = router;

提交程式碼更改並將其推送到 Git 倉庫。然後,在 Kinsta 上手動重新部署或等待自動部署。

現在,當你以 id=1 查詢 /states 端點時,你將從資料庫中收到一個狀態。

向 MyKinsta 託管的全功能應用程式發出 GET 請求

向 MyKinsta 託管的全功能應用程式發出 GET 請求。

這就是全部內容!您可以在 GitHub 上檢視完整的專案程式碼

小結

本文演示了 Express 框架如何讓建立和部署 Node.js 應用程式變得快速而簡單。只需幾個簡單的步驟,您就可以使用 Express 生成器建立一個新的應用程式。

在 Node.js 應用程式開發中使用 Express 框架的強大功能和簡便性是顯而易見的。使用 Kinsta 或者大部分雲伺服器提供商,您可以將 Express 和 Node.js 帶來的動力帶入專案的部署階段,而無需浪費時間進行配置。

評論留言