用Now轻松部署无服务器Node应用程序
作者 | William Imo 译者 | 方彦 编辑 | Yonie 本文作者将用 Now(https://zeit.co/now) 来部署一个简单的 node 应用程序演示,帮助大家学习怎样使用 Now 的 CLI 工具来轻松部署一个 Node 应用程序。 Node.js 是一个 JavaScript 的运行环境,运行于浏览器之外。应用程序和 API 可以用 Node.js 来构建。应用程序间使用 API 来共享数据。然而,这些应用程序和 API,需要托管在网络上,这样网络上的其它应用程序才能访问到它。 在本文中,我们会用 Now 的 CLI 服务来部署一个简单的 Node 应用程序。
部署 Node 应用程序的步骤
按下列步骤部署一个 Node 应用程序:
- 在 node 工程中创建 now.json 文件。
- 给 node app 指定 build 文件和所需的 builder(对于 node app,是 @now/node-server)。
- 在 now.json 里给每个 API 端点创建路由。
- 确保服务器入口文件名字为 index.js ,或者在 now.json 中制定 home route。
- 使用命令 now 进行发布。 ZEIT 的 Now 是一个云部署的无服务器解决方案,提供静态和动态应用程序的无缝部署。
安装
因这是一个 Nodejs 项目,要确保已经有 node 和相应的包管理器 npm,安装方式如下:
node -v && npm -v
如果已经安装,就会打印当前的版本号。如果还没有安装,会进入 nodejs page 进行下载并安装: https://nodejs.org/en/ 接下来,从 npm 安装 Now CLI:
npm install -g now
使用下面的命令创建新的 now-express 工程:
mkdir now-express
在工程目录下,使用下面命令创建空的 node 工程:
npm init -y
这样就创建了一个 node 工程,它有缺省的配置和相应的 package.json 文件。 在项目中安装 express:
npm install --save express
Express 是一个可以有效构建 web 服务器的 Node.js 框架。链接地址: https://expressjs.com/
创建一个 Web 服务器
在根目录 index.js 下创建一个新文件夹,可以取任意名字,用来作为应用程序的入口。在 index.js 中,导入 express,使用 express 内嵌的 body parser,在端口 5000 创建一个 listener,如下所示:
const express = require("express");const app = express();
const port = 5000;
// Body parser
app.use(express.urlencoded({ extended: false }));
// Listen on port 5000
app.listen(port, () => {
console.log(`Server is booming on port 5000
Visit http://localhost:5000`);
});
在 index.js 中,创建 home 路由和两个简单的模拟 API 端点:
// Import Dependencies
//Specify port
// Body parser
// Home route
app.get("/", (req, res) => {
res.send("Welcome to a basic express App");
});
// Mock APIs
app.get("/users", (req, res) => {
res.json([
{ name: "William", location: "Abu Dhabi" },
{ name: "Chris", location: "Vegas" }
]);
});
app.post("/user", (req, res) => {
const { name, location } = req.body;
res.send({ status: "User created", name, location });
});
现在,我们创建了两个 API 端点,用来获取用户并发送用户通知。传送一个用户到服务器的端点,它会在 response 中返回该用户。 package.json 文件中,包括启动服务器的脚本,可更新如下:
{
"name": "now-express",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
},
"keywords": [],
"author": "William Imoh",
"license": "MIT",
"dependencies": {
"express": "^4.17.1",
"nodemon": "^1.19.1"
}
}
运行下列命令,启动服务器:
npm run start
从浏览器上进入:http://localhost:5000,查看这个简单的页面: 你可以在浏览器里检查 /users 路由,使用 Postman 数据,对 /user 做 API 调用。
使用 Now 部署应用程序
现在,需要配置文件 now.json,用来构建一个 node 应用程序,并创建一个 lambda 表达式。没有该配置文件,文件都是静态的。在应用程序的根目录下创建文件 now.json。 在该配置文件中,构建 app 所需的主要参数由更重要的 build 和 builder 来指定。按下列步骤在 now.json 中创建 index.js 文件的 build。
{
"version": 2,
"builds": [{ "src": "index.js", "use": "@now/node-server" }],
}
现在,我们首先要指定 Now 平台的版本(版本 2),然后指定该 node 应用程序的源文件。在 Node 应用程序中,推荐使用 @now/node-server builder。 使用 @now/node 编译器,会在部署后访问该应用程序时抛出一个错误。 在单独的无服务器 node 应用中,推荐使用 @now/node。 访问 builds 和 builders,可以了解更多详情,详细链接地址: builds: https://zeit.co/docs/v2/deployments/builds/ builders: https://zeit.co/docs/v2/deployments/builders/overview/ 按这种设置,我们可以发布应用程序,并获得有效的 URL,我们必须指定 API 路由,否则 app 部署后,不能访问到它们。如果没有在 now.json 中指定的话,在访问任何路由或路由组时,都会出现以下错误。 在 now.json 中创建路由密钥, 按以下示例编辑 now.json :
{
"version": 2,
"builds": [{ "src": "index.js", "use": "@now/node-server" }],
"routes": [
{
"src": "/users",
"dest": "/index.js",
"methods": ["GET"]
},
{
"src": "/user",
"dest": "/index.js",
"methods": ["POST"]
}
]
}
这将两个可用的端点指向目标路径,也指定了每个端点上的可用 HTTP verbs。如果没有申明可用的方法,端点会被所有 HTTP request 可见。 这些路由也携带着给每条路由指定可用头文件和状态代码的密钥。可以点击链接下面的链接,获得有关发布时路由处理的更多信息: https://zeit.co/docs/v2/deployments/routes/ 在命令行,用下面命令发布你的应用程序:
now
这样就发布了你的应用程序,并提供有效的 URL,在我的例子中,会看到如下信息: 你可以在 https://now-express.williamimoh.now.sh 上的 /users 里看到一个带服务器数据的对象。
问题
主要需要注意的是,也许你的服务器文件名字和 index.js 不一样,但是 Now 要求入口文件名字为 index,扩展名为 js,以便于识别。如果不遵守这个命名规范,则需要使用目录列表解析应用程序: https://zeit.co/docs/v2/routing/directory-listing Now 要求入口 node 文件命名为 index.js。 一个变通的方法则是,在 now.json 中指定 home 路由,并把目标路径指向该服务器文件。这样,在 now.json 中指定的构建源文件就为该服务器文件。 假设在工程中将入口文件从 index.js 重命名为 server.js,now.json 则变为:
{
"version": 2,
"builds": [{ "src": "server.js", "use": "@now/node-server" }],
"routes": [
{
"src": "/",
"dest": "/server.js",
"methods": ["GET"]
},
{
"src": "/users",
"dest": "/server.js",
"methods": ["GET"]
},
{
"src": "/user",
"dest": "/server.js",
"methods": ["POST"]
}
]
}
}
可以在 Githuab 找到完整的工程: https://github.com/Chuloo/now-express
结论
在本文中,我们用 Now 部署了一个简单的 node 应用程序,并得到一个有效的 URL。我们也了解到使用 Now 部署一个应用程序会遇到的问题。如果你有任何的问题和建议,欢迎在本文后添加评论。 如果喜欢本文,请关注 Twitter 上的 @iChuloo: https://twitter.com/iChuloo \o Follow @iChuloo on Twitter 英文原文: https://scotch.io/tutorials/easily-deploy-a-serverless-node-app-with-zeit-now