使用无服务器、Express 和 Nodejs 构建和部署 Rest API
什么是 Aws Lambda?
如何监控和跟踪您的 Lamda 调用?
今天我将展示如何使用无服务器 lambda 构建和部署 express/Node Rest API。
我们知道无服务器正在快速发展,许多公司通过使用无服务器计算来节省成本。
亚马逊网络服务为我们提供了各种各样的服务来构建和部署从小规模到大规模的应用程序。
什么是 Aws Lambda?
AWS Lambda 无需预置或管理服务器即可运行您的代码,这意味着您无需购买或管理服务器。您只需在代码运行或用户访问您的网站时付费。
要求是什么?
-
Nodejs v8+
我正在使用无服务器框架 Cli 来创建和部署应用程序。
打开你的终端
npm install -g serverless
sls login // SLS is a shortcut of serverless
sls 登录后,您需要使用无服务器框架配置您的 Aws 凭证。
一旦完成,您就可以开始了。
创建和部署 Rest API 端点
在工作目录中创建模板
serverless create --template aws-nodejs
上述命令生成样板。
现在我们需要初始化Package.json文件并安装
一些依赖项。
npm init -y // generates package.json file
npm i -s body-parser cors express mongoose serverless-http
在您最喜欢的代码编辑器中打开您的应用程序文件夹。
创建一个 app.js 文件并导入我正在使用的数据库 mongodb 的要求。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const serverless = require("serverless-http"); | |
const express = require("express"); | |
const bodyParser = require("body-parser"); | |
const cors = require("cors"); | |
const mongoose = require("mongoose"); | |
const User = require("./models/data"); | |
const app = express(); | |
mongoose | |
.connect("mongodb://tests:tests@ds153958.mlab.com:53958/myapiproject") | |
.then(() => console.log("Connected to m labs")) | |
.catch(err => console.log(err)); | |
app.use(cors()); | |
// parse application/x-www-form-urlencoded | |
app.use(bodyParser.urlencoded({ extended: false })); | |
// parse application/json | |
app.use(bodyParser.json()); | |
app.get("/user", function(req, res) { | |
User.find({}) | |
.then(data => { | |
res.status(200).send(data); | |
}) | |
.catch(err => res.send("Something Went Wrong")); | |
}); | |
app.post("/user", function(req, res) { | |
const name = req.body.name; | |
const age = req.body.age; | |
const user = User({ | |
name, | |
age | |
}); | |
user | |
.save() | |
.then(data => res.status(200).send(data)) | |
.catch(err => res.send("Error occured")); | |
}); | |
app.put("/user/:id", function(req, res) { | |
const name = req.body.name; | |
const age = req.body.age; | |
User.findByIdAndUpdate( | |
{ _id: req.params.id }, | |
{ | |
$set: { | |
name,age | |
} | |
}, | |
{ new: true } | |
) | |
.then(data => res.send(data)) | |
.catch(err => res.send(err)); | |
}); | |
app.delete("/user/:id", function(req, res) { | |
User.findByIdAndRemove({ _id: req.params.id }) | |
.then(data => res.send(data)) | |
.catch(err => res.send("Error Occured ")); | |
}); | |
module.exports.handler = serverless(app); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
const serverless = require("serverless-http"); | |
const express = require("express"); | |
const bodyParser = require("body-parser"); | |
const cors = require("cors"); | |
const mongoose = require("mongoose"); | |
const User = require("./models/data"); | |
const app = express(); | |
mongoose | |
.connect("mongodb://tests:tests@ds153958.mlab.com:53958/myapiproject") | |
.then(() => console.log("Connected to m labs")) | |
.catch(err => console.log(err)); | |
app.use(cors()); | |
// parse application/x-www-form-urlencoded | |
app.use(bodyParser.urlencoded({ extended: false })); | |
// parse application/json | |
app.use(bodyParser.json()); | |
app.get("/user", function(req, res) { | |
User.find({}) | |
.then(data => { | |
res.status(200).send(data); | |
}) | |
.catch(err => res.send("Something Went Wrong")); | |
}); | |
app.post("/user", function(req, res) { | |
const name = req.body.name; | |
const age = req.body.age; | |
const user = User({ | |
name, | |
age | |
}); | |
user | |
.save() | |
.then(data => res.status(200).send(data)) | |
.catch(err => res.send("Error occured")); | |
}); | |
app.put("/user/:id", function(req, res) { | |
const name = req.body.name; | |
const age = req.body.age; | |
User.findByIdAndUpdate( | |
{ _id: req.params.id }, | |
{ | |
$set: { | |
name,age | |
} | |
}, | |
{ new: true } | |
) | |
.then(data => res.send(data)) | |
.catch(err => res.send(err)); | |
}); | |
app.delete("/user/:id", function(req, res) { | |
User.findByIdAndRemove({ _id: req.params.id }) | |
.then(data => res.send(data)) | |
.catch(err => res.send("Error Occured ")); | |
}); | |
module.exports.handler = serverless(app); |
创建一个 data.js 文件。
const mongoose = require('mongoose');
const Users = mongoose.Schema({
name: String,
age: Number,
})
const User = mongoose.model('User', Users);
module.exports = User;
这是我们简单的用户模型。
打开您的 serveless.yml 并添加以下代码。
- 运行时 nodejs8.10 为什么因为 Aws lambda 目前支持 v8.10。
- handler:我们需要定义 app.handler,这意味着请查看 app.js 文件。
- serverless-offline 插件帮助我们将您的应用程序运行到本地环境中。
打开终端并运行。
sls offline start // to run the code in local environment
哇,我们的代码运行时没有任何错误。
如何将代码部署到 Aws Lambda?
- 无服务器框架在后台完成所有工作,非常简单
打开你的终端并运行。
sls deploy
运行上述命令一段时间后,您的 API 端点就会显示在终端中。
如何测试 API 端点?
- 我正在使用 Postman 来测试 API 端点。
Post 方法
获取方法
如何部署现有的 REST API?
- 打开您的 app.js 文件或 main.js 文件并添加这些导出。
const serverless = require('serverless-http');
const express = require('express');
const app = express();
*express code*
module.exports.handler = serverless(app);
2.设置你的 serverless.yml
如何监控和跟踪您的 Lamda 调用?
为了监控、调试和检测 lambda 的错误,我们使用Dashbird
为什么选择 Dashbird?
-
Dashbird 帮助我们主动监控健康和错误。
-
Dashbird 的一个主要特点是其用户友好的界面。
-
Dashbird 可视化您的所有 AWS Lambda 指标,如
内存利用率、调用次数和执行持续时间。