65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Node.js 中创建简单的 API

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (22投票s)

2018 年 4 月 12 日

CPOL

13分钟阅读

viewsIcon

111703

downloadIcon

4197

如何创建简单的 Node.js API,并使用 MS SQL 作为数据源来执行 CRUD 操作

本文旨在让初学者和专业人士都能轻松理解。

在开始创建 API 之前,让我们先了解一些基础知识。

什么是 Node.js?

  • 一个开源的、跨平台的、用于在浏览器外部执行 JavaScript 代码的运行时环境。

我们可以用它来构建什么?

  • 我们可以使用 Node.js 构建 Web 应用和 API。

既然已经有其他框架了,为什么还要用 Node.js?

  • 它速度极快且高度可扩展,例如 PayPal、Uber、Netflix 都使用它。
  • 用更少的人,构建速度提高一倍。
  • 代码行数减少 33%。
  • 文件数量减少 40%。
  • 每秒请求数翻倍。
  • 响应速度提高 35%。

拥有庞大的开源库生态系统。

JavaScript 无处不在(前端 + 后端)。

您可以使用 JavaScript 编写整个应用程序,无需学习新语言。

必备组件

  1. 安装 Node.js [下载 Node.js https://node.org.cn/en/]
  2. 接下来,我们将使用 Visual Studio Code IDE 进行开发 [https://vscode.js.cn/download]
  3. SQL Server 数据库

让我们先从数据库开始。

我创建了一个名为“TESTDB”的示例数据库,其中包含一个名为“Products”的表。

Products 表

创建 Node.js 应用程序

创建数据库和表之后,接下来我们将创建一个 Node.js 应用程序。

创建简单的目录

创建目录后,接下来我们将测试 Node,以验证安装的 Node 是否正常工作。我们将输入命令“node”。输入命令后,它应该会进入语言 shell 模式,如下图所示。

创建目录并了解如何使用“node”命令后,现在让我们创建 *package.json*。

什么是 package.Json?

该文件包含应用程序的名称、版本,并列出您的项目所依赖的包。它允许您根据语义版本控制规则指定项目可以使用哪些包的版本。这使得您的构建可重现,因此更容易与其他开发人员共享。

参考链接:https://goo.gl/pXwGB2

创建 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) 下载。

安装模块

  1. Express

    快速、不固执、极简的 Node.js Web 框架。

    更多详情可在 https://npmjs.net.cn/package/express 找到。

  2. body-parser

    Node.js 请求体解析中间件。

    在处理程序之前,在中间件中解析传入的请求体,可在 `req.body` 属性下访问。

  3. Mssql

    Microsoft SQL Server 的 Node.js 客户端。

  4. 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 之后,我们编写了一个具有两个参数(requestresponse)的回调函数。我们将使用 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 日:初始版本
© . All rights reserved.