在 Node.js 中创建简单的 API






4.97/5 (22投票s)
如何创建简单的 Node.js API,并使用 MS SQL 作为数据源来执行 CRUD 操作
本文旨在让初学者和专业人士都能轻松理解。
在开始创建 API 之前,让我们先了解一些基础知识。
什么是 Node.js?
- 一个开源的、跨平台的、用于在浏览器外部执行 JavaScript 代码的运行时环境。
我们可以用它来构建什么?
- 我们可以使用 Node.js 构建 Web 应用和 API。
既然已经有其他框架了,为什么还要用 Node.js?
- 它速度极快且高度可扩展,例如 PayPal、Uber、Netflix 都使用它。
- 用更少的人,构建速度提高一倍。
- 代码行数减少 33%。
- 文件数量减少 40%。
- 每秒请求数翻倍。
- 响应速度提高 35%。
拥有庞大的开源库生态系统。
JavaScript 无处不在(前端 + 后端)。
您可以使用 JavaScript 编写整个应用程序,无需学习新语言。
必备组件
- 安装 Node.js [下载 Node.js https://node.org.cn/en/]
- 接下来,我们将使用 Visual Studio Code IDE 进行开发 [https://vscode.js.cn/download]
- SQL Server 数据库
让我们先从数据库开始。
我创建了一个名为“TESTDB
”的示例数据库,其中包含一个名为“Products
”的表。
Products 表
创建 Node.js 应用程序
创建数据库和表之后,接下来我们将创建一个 Node.js 应用程序。
创建简单的目录
创建目录后,接下来我们将测试 Node,以验证安装的 Node 是否正常工作。我们将输入命令“node
”。输入命令后,它应该会进入语言 shell 模式,如下图所示。
创建目录并了解如何使用“node
”命令后,现在让我们创建 *package.json*。
什么是 package.Json?
该文件包含应用程序的名称、版本,并列出您的项目所依赖的包。它允许您根据语义版本控制规则指定项目可以使用哪些包的版本。这使得您的构建可重现,因此更容易与其他开发人员共享。
创建 package.json
为了创建 *package.json* 文件,我们将首先执行命令“npm init
”。
执行命令后,它将开始询问问题以生成 *package.json* 文件。
它将询问的第一个问题是应用程序名称。在这里,我将输入“demoproductapi
”,接下来,它将询问版本。默认情况下是 1.0.0,之后它会询问描述。我将输入“product API”,接下来,它将询问入口点。在这里,我将输入 server.js “server.js”作为我们应用程序的入口点,接下来,我们不设置测试命令、git 存储库和关键字,最后,我们将设置作者和许可证。
之后,它将向您展示它将写入 *package.json* 文件中的内容。
最后,它会问您是否要使用您设置的设置生成 *package.json* 文件。如果您回答“是”,它将创建该文件。
接下来,它已生成您的 *package.json* 文件。
从命令提示符在 Visual Studio Code 中打开项目
现在要将此文件打开到 Visual Studio Code 中,我们将输入“code”。
输入命令后,它将打开 Visual Studio Code,如下图所示。
注意:Visual Studio Code IDE 的主题颜色可能不同,但您可以根据需要设置自定义主题颜色。
在 Visual Studio Code 中打开项目后,我们将安装创建 API 所需的各种包。
所有包都将从 npm (Node Package Manager) 下载。
安装模块
- Express
快速、不固执、极简的 Node.js Web 框架。
更多详情可在 https://npmjs.net.cn/package/express 找到。
- body-parser
Node.js 请求体解析中间件。
在处理程序之前,在中间件中解析传入的请求体,可在 `req.body` 属性下访问。
- Mssql
Microsoft SQL Server 的 Node.js 客户端。
- joi
JavaScript 对象的模式描述语言和验证器。
要从 Visual Studio Code 安装包,您可以使用快捷键 [Ctrl + ‘~'] 在 Visual Studio Code 中打开终端。
请注意,`--save` 选项指示 NPM 自动将模块包含在 *package.json* 文件的依赖项部分。
命令:npm install --save express body-parser mssql joi
输入命令后,只需按 Enter 键即可安装模块。
安装后,您将在 *package.json* 文件中看到所有模块及其版本。
接下来,我们将添加一个名为 server.js 的 JS 文件。
添加 Server.js 文件
在这一部分,我们将添加 *server.js* 文件,并在该文件中使用 express 框架创建一个简单的服务器,该服务器将处理 HTTP 请求。
要添加文件,只需在资源管理器中右键单击并选择“新建文件”,然后将您的文件命名为 *Server.js*。
到目前为止,我们已经安装了所有模块。要将该模块用于 Node.js 应用程序,我们需要使用“require
”关键字。
现在要运行此应用程序,我们将使用快捷键 [ Ctrl + ‘~'] 打开终端。
接下来,我们将输入命令 node 和文件名。
命令:- "node server.js
"。
输入命令后,您可以看到我们已写入的日志。这表明应用程序正在运行。
注意:什么是回调?
回调是一个函数,它在给定任务完成时被调用;这可以防止任何阻塞,并允许在此期间运行其他代码。
参考:https://docs.nodejitsu.com/articles/getting-started/control-flow/what-are-callbacks/
创建简单的服务以供理解
为了创建简单的 API,我们将使用之前已下载的 express 框架。
我们将创建的第一个 API 是 Get
product API,它将以 JSON 格式返回一个简单的欢迎消息作为响应。
为了处理 get 请求,我们使用了 Http Get
方法,接下来我们为 API 提供了路径“/product
” 之后,我们编写了一个具有两个参数(request
和 response
)的回调函数。我们将使用 response
参数以 JSON 格式发送 response
。
第一个 API 的代码片段
var express = require('express');
var app = express();
var port = process.env.port || 1337;
app.get("/product",function(request,response)
{
response.json({"Message":"Welcome to Node js"});
});
app.listen(port, function () {
var datetime = new Date();
var message = "Server running on Port:- " + port + "Started at :- " + datetime;
console.log(message);
});
完成创建 API 后,接下来,为了测试它的工作原理,我们将使用 REST 客户端“POSTMAN”。
使用 POSTMAN REST 客户端测试 API
有各种可用的 REST 客户端,您可以使用任何一个来测试 API。对于此演示,我将使用 POSTMAN。
我们将发送 Get
请求。为此,我将请求方法设置为 Get
类型。此外,我输入了 localhost URL 及其端口号和 API 路径 https://:1337/product 设置请求 URL 后,最后一步是将 Content-Type
设置为 application/json
并单击 Send 按钮发送请求。
发送请求后,我们得到 API 响应中设置的响应。
太棒了,我们已经在 Node.js 中创建了一个简单的 API!
现在我们已经学会了如何创建简单的 API,但我们已经将所有代码都写在了 *server.js* 文件中,如果我们要添加更多 API,它会变得混乱。为了避免这种情况,我们将创建一个单独的数据库连接文件和控制器文件,并在这些文件中编写代码并导出它,以便我们可以随时访问它。
创建 GET API
Connect.js 用于创建数据库连接以使用 SQL Server
我们创建了一个名为“connection”的新文件夹,并在该文件夹中添加了一个 *connect.js* 文件。
创建文件后,接下来,我们将导入“mssql
”模块以创建 SQL 连接,最后,我们将导出此连接,以便可以在其他模块中使用。
代码片段
var sql = require("mssql");
var connect = function()
{
var conn = new sql.ConnectionPool({
user: 'sa',
password: 'Pass@123',
server: 'SAI-PC',
database: 'TESTDB'
});
return conn;
};
module.exports = connect;
添加 connect.js 以创建 SQL 连接文件后,接下来我们将添加Controller文件夹,并在该文件夹中添加 Product Controller js 文件。
ProductController.js 用于创建路由
我们将使用 Route 在一个路由器中定义所有产品的路由。
例如,所有“/product”路由都可以定义在一个路由器中。将来,如果我们必须向产品添加任何新路由,我们可以在“/product”路由中轻松定义,所有与产品相关的路由都将集中在一个地方。
现在我们已经添加了 *ProductController.js* 文件。接下来,我们将导入模块并创建一个路由。
加载所需模块
代码解释
首先,我们将加载我们需要的外部模块。
var express = require('express');
var router = express.Router();
var sql = require("mssql");
var conn = require("../connection/connect")();
Express
:express 是一个用于创建 API 的 Web 框架。Router
:router 用于创建路由。SQL
:Microsoft SQL Server 的 Node.js 客户端。Conn
:我们从 connect.js 类导入 SQL 连接。
导入模块后,我们定义了匿名函数并存储在“routes
”变量中。
接下来,我们定义了路由 router.route('/')
。
定义路由后,接下来,我们声明了 HTTP 方法“Get
”并编写了一个回调。
.get(function (req, res)
注意:connect
创建一个新的连接池。初始探测连接用于确定配置是否有效。
之后,我们将使用 Connect
函数创建新的连接池。
conn.connect().then(function ()
{
创建连接后,我编写了一个查询来从数据库获取所有产品。
var sqlQuery = "SELECT * FROM Products";
在我们编写了查询之后,我们将创建一个新的 SQL 请求并将其(conn
)传递给它。
然后请求(req
)有一个 query 方法,它接受一个命令字符串作为输入。我们将把我们的 sqlQuery
传递给它,该查询有一个回调,它将返回一个响应。
var req = new sql.Request(conn);
req.query(sqlQuery).then(function (recordset)
{
res.json(recordset.recordset);
conn.close();
})
从 MS SQL 驱动程序获得的响应将是 JSON 格式,Get
API 将返回所有产品的 JSON。
最后,我们编写了一个 catch
方法来捕获异常。
.catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
完成创建路由后,保存 *ProductController.js*。
在 server.js 中设置处理路由请求的中间件
创建 *ProductController.js* 后,接下来我们将导入 *ProductController.js* 文件到 *server.js* 中。
var express = require('express');
var app = express();
var port = process.env.port || 1337;
var productController = require('./Controller/ProductController')();
现在我们已经导入了 *ProductController.js* 文件。接下来,我们将使用 app.use
方法来调用我们的 API。
注意:app.use([path,] callback [, callback...])
引用自:https://express.js.cn/en/api.html#app.use
当请求路径的基础与 path 匹配时,将执行中间件函数。
app.use
方法接受两个参数。第一个参数是 path
,第二个参数是 function
或中间件函数。
如果匹配我们请求的路径“/api/products”,那么它将调用 Productcontroller
函数并以 JSON 格式返回响应。
Products 表
保存整个应用程序并运行。
现在要访问 API,打开 Postman 或任何其他 REST 客户端并输入 URL:https://:1337/api/products,将 HTTP 方法请求设置为 Get
,然后单击 Send 请求。
Get API 的响应
理解 get 请求后,接下来我们将创建 POST
请求 API。
创建 POST API
在 post
API 中,我们首先将创建存储过程以将记录插入 products
表。
接下来,就像我们在 get
API 中编写路由一样,我们将以相同的方式编写 POST
API 路由。
但是这段代码片段中有一些新内容,因为我们正在使用带事务的存储过程,并且在此请求中,我们将从 post 请求体中获取值,并将它们插入到 product
表中。
POST API 的代码片段
router.route('/')
.post(function (req, res) {
conn.connect().then(function () {
var transaction = new sql.Transaction(conn);
transaction.begin().then(function () {
var request = new sql.Request(transaction);
request.input("ProductName", sql.VarChar(50), req.body.ProductName)
request.input("ProductPrice", sql.Decimal(18, 0), req.body.ProductPrice)
request.execute("Usp_InsertProduct").then(function () {
transaction.commit().then(function (recordSet) {
conn.close();
res.status(200).send(req.body);
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
});
现在我们已经完成了 post
请求的创建。接下来,我们将对 server.js 文件进行一些更改。
我们将使用 body-parser 包来解析传入的请求,我们已经安装了 body-parser 包。
注意:
什么是 body-parser?
Node.js 请求体解析中间件。在处理程序之前,在中间件中解析传入的请求体,可在 `req.body` 属性下访问。
引用自 https://npmjs.net.cn/package/body-parser。
简化定义
body-parser
从传入请求流中提取整个主体部分,并在 req.body 上公开它。
加载 body-parser
模块。
加载 Body-Parser 模块的代码片段
var bodyParser = require('body-parser');
// create application/x-www-form-urlencoded parser
app.use(bodyParser.urlencoded({ extended: true }));
// create application/json parser
app.use(bodyParser.json());
保存整个应用程序并运行。
现在要访问 POST API,请打开 Postman 或任何其他 REST 客户端并输入。
URL:https://:1337/api/products,将 HTTP 方法请求设置为 POST
,并在请求体中添加下面的请求 JSON,下一步是将标头“Content-Type
”设置为“application/json
”,最后单击 Send 请求。
请求 Json
{
"ProductName": "WebCam",
"ProductPrice": "5000"
}
注意:不要忘记将标头“Content-Type
”设置为“application/json
”。
POST API 的响应
成功发布数据后,让我们看看它是否存在于 products
表中。
插入数据后的 Products 表视图
太棒了,我们已成功在 products
表中插入了产品。
注意:
req.query
:直接访问解析后的查询字符串参数。req.params
:直接访问路径中的解析后的路由参数。
引用自:http://stackabuse.com/get-query-strings-and-parameters-in-express-js/
创建 PUT API
在 PUT
API 中,我们首先将创建存储过程以更新 products
表的记录。
更新资源
为了更新 product
,我们将从 Uri 发送 product
的 id,以及包含我们想要更新的数据的请求体。
设置 Uri 和请求体后,接下来,我们将在 Product
控制器文件中添加 HTTP Put
方法,此方法的路由将不同,因为我们将接受“id
”作为参数,以及请求体。
要读取路由参数值,我们使用 request.params
。
PUT API 的代码片段
router.route('/:id')
.put(function (req, res)
{
var _productID = req.params.id;
conn.connect().then(function () {
var transaction = new sql.Transaction(conn);
transaction.begin().then(function () {
var request = new sql.Request(transaction);
request.input("ProductID", sql.Int, _productID)
request.input("ProductPrice", sql.Decimal(18, 0), req.body.ProductPrice)
request.execute("Usp_UpdateProduct").then(function () {
transaction.commit().then(function (recordSet) {
conn.close();
res.status(200).send(req.body);
}).catch(function (err) {
conn.close();
res.status(400).send("Error while updating data");});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while updating data");});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while updating data");});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while updating data");});
});
完成添加 put
方法后,保存整个应用程序并运行。
现在要访问 PUT API,请打开 Postman 或任何其他 REST 客户端并输入。
URL:https://:1337/api/products/7,将 HTTP 方法请求设置为 PUT
,并在请求体中添加下面的请求 JSON,下一步是将标头“Content-Type
”设置为“application/json
”,最后单击 Send 请求。
请求 JSON
{
"ProductPrice": "5000"
}
注意:不要忘记将标头“Content-Type
”设置为“application/json
”。
如果更新请求成功,它可能会返回状态 200 (OK),同时,我们将在响应中获得请求体。
现在我们已经完成了 PUT
请求的创建,接下来我们将添加 Delete
HTTP 方法来删除产品。
创建 Delete API
在 Delete
API 中,我们首先将创建存储过程以从 products
表中删除 product
记录。Delete
HTTP 方法路由与 PUT
API 路由类似,它从 Uri 获取 productID
,并在此基础上删除 product
记录。
删除资源
在这一部分,我们将 Delete
产品。为此,我们将从 Uri 发送产品的 id,如您在下面的快照中所见。
要读取路由参数值,我们使用 request.params
。
Delete API 的代码片段
router.route('/:id')
.delete(function (req, res) {
var _productID = req.params.id;
conn.connect().then(function () {
var transaction = new sql.Transaction(conn);
transaction.begin().then(function () {
var request = new sql.Request(transaction);
request.input("ProductID", sql.Int, _productID)
request.execute("Usp_DeleteProduct").then(function () {
transaction.commit().then(function (recordSet) {
conn.close();
res.status(200).json("ProductID:" + _productID);
}).catch(function (err) {
conn.close();
res.status(400).send("Error while Deleting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while Deleting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while Deleting data");
});
})
});
完成添加 Delete
方法后,保存整个应用程序并运行。
现在要访问 Delete
API,请打开 Postman 或任何其他 REST 客户端并输入。
URL:https://:1337/api/products/7,将 HTTP 方法请求设置为 Delete
,并将标头“Content-Type
”设置为“application/json
”,最后单击 Send 请求。
注意:不要忘记将标头“Content-Type
”设置为“application/json
”。
删除产品后的 Products 表视图
完整的项目结构
结论
到目前为止,我们已经学会了如何简单地创建 Node.js API,我们从创建 Node.js 应用程序开始,之后,我们在 *server.js* 文件中创建了一个简单的 GET
API。接下来,我们在其中创建了 product controller,在其中创建了路由并将整个 API 逻辑移到了这个 controller 中,同时在 SQL Server 中,我们为插入、更新和删除数据创建了存储过程。最后,我们使用 POSTMAN 测试了我们创建的 API。
我希望您喜欢我的文章,以快速入门 Node.js。在下一篇文章中,您将学习如何验证 API 请求。
历史
- 2018 年 4 月 12 日:初始版本