用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