node.js 和 Express 编写您的第一个 api :了解 rest API 使用 Node.js 和 Express 编写您的第一个 API:连接数据库
如何在 Node.js 中设置 Express API 服务器
在上一篇教程中,我们了解了什么是 REST 架构、REST 的六个指导约束、如何理解 HTTP 请求方法及其响应代码,以及 RESTful API 端点的剖析。
在本教程中,我们将为我们的 API 建立一个服务器。您可以使用任何编程语言和服务器软件构建 API ,但我们将使用Node.js ,它是javascript的后端实现,以及Express,一个流行的 Node 最小框架。
安装
我们的第一个先决条件是确保在计算机上全局安装 Node.js 和 npm。我们可以使用-v
将显示版本的标志来测试两者。打开命令提示符并键入以下内容。
node -v && npm -v
v10.8.0 6.2.0
你的版本可能与我的略有不同,但只要两者都存在,我们就可以开始了。
让我们创建一个名为的项目目录express-api
并移动到它。
mkdir express-api && cd express-api
现在我们在我们的新目录中,我们可以使用 init 命令初始化我们的项目。
npm init
该命令将提示您回答有关项目的一些问题,您可以选择填写或不填写。设置完成后,您将拥有一个如下所示的package.json文件:
{ "name": "express-api", "version": "1.0.0", "description": "Node.js and Express REST API", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Tania Rascia", "license": "MIT" }
现在我们有了package.json,我们可以安装项目所需的依赖项。幸运的是,我们不需要太多的依赖项,只需要下面列出的这四个。
我们将使用install
每个依赖项后跟的命令来完成项目的设置。
npm install body-parser express mysql request
这将创建一个package-lock.json文件和一个node_modules目录,我们的package.json将被更新为如下所示:
{ "name": "express-api", "version": "1.0.0", "description": "Node.js and Express REST API", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Tania Rascia", "license": "MIT", "dependencies": { "dependencies": { "body-parser": "^1.18.3", "express": "^4.16.3", "mysql": "^2.16.0", "request": "^2.88.0" } }
设置 HTTP 服务器
在开始设置 Express 服务器之前,我们将使用 Node 的内置http
模块快速设置 HTTP 服务器,以了解简单服务器的工作原理。
创建一个名为hello-server.js的文件。加载http
模块,设置端口号(我选择了3001
),使用createServer()
方法创建服务器。
// Build a server with Node's HTTP module const http = require('http'); const port = 3001; const server = http.createServer();
在介绍性 REST 文章中,我们讨论了关于 HTTP 服务器的请求和响应。我们将设置我们的服务器来处理请求并在服务器端显示请求的 URL,并显示一个Hello, server!在响应端向客户端发送消息。
server.on('request', (request, response) => { console.log(`URL: ${request.url}`); response.end('Hello, server!') })
最后,我们将告诉服务器监听哪个端口,如果有则显示错误。
// Start the server server.listen(port, (error) => { if (error) return console.log(`Error: ${error}`); console.log(`Server is listening on port ${port}`) })
现在,我们可以用node
文件名启动我们的服务器。
node hello-server.js
您将在终端中看到此响应:
Server is listening on port 3001
要检查服务器是否实际运行,请转到https://localhost:3001/
浏览器的地址栏中。如果一切正常,您应该会看到您好,服务器!在页面上。在您的终端中,您还会看到所请求的 URL。
URL: / URL: /favicon.ico
如果您要导航到http://localhost:3001/hello
,您会看到URL: /hello
。
我们还可以在本地服务器上使用curl,它会向我们显示正在返回的确切标题和正文。
curl -i http://localhost:3001
HTTP/1.1 200 OK Date: Wed, 15 Aug 2018 22:14:23 GMT Connection: keep-alive Content-Length: 14 Hello, server!
如果您随时关闭终端窗口,服务器将消失。
现在我们已经了解了服务器、请求和响应是如何协同工作的,我们可以在 Express 中重写它,它具有更简单的界面和扩展功能。
设置 Express 服务器
我们将创建一个新文件app.js,它将作为我们实际项目的入口点。就像原始的 http 服务器一样,我们需要一个模块并设置一个端口来启动。
创建一个app.js文件并将以下代码放入其中。
// Require packages and set the port const express = require('express'); const port = 3002; const app = express();
现在,我们将明确声明我们正在GET
服务器的根目录上查找请求,而不是查找所有请求(/
)。当/
收到请求时,我们将显示请求的 URL 和“Hello,Server!” 信息。
app.get('/', (request, response) => { console.log(`URL: ${request.url}`); response.send('Hello, Server!'); });
最后,我们将3002
使用该listen()
方法在端口上启动服务器。
// Start the server const server = app.listen(port, (error) => { if (error) return console.log(`Error: ${error}`); console.log(`Server listening on port ${server.address().port}`); });
我们可以像以前一样启动服务器node app.js
,但我们也可以修改package.jsonscripts
文件中的属性来自动运行这个特定的命令。
"scripts": { "start": "node app.js" },
现在我们可以使用npm start
启动服务器了,我们将在终端中看到我们的服务器消息。
Server listening on port 3002
如果我们curl -i
在 URL 上运行 a,我们将看到它现在由 Express 提供支持,并且还有一些额外的标头,例如Content-Type
.
curl -i http://localhost:3002
HTTP/1.1 200 OK X-Powered-By: Express Content-Type: text/html; charset=utf-8 Content-Length: 14 ETag: W/"e-gaHDsc0MZK+LfDiTM4ruvL4pUqI" Date: Wed, 15 Aug 2018 22:38:45 GMT Connection: keep-alive Hello, Server!
添加正文解析中间件
为了方便我们的API处理post
和PUT
请求,我们将添加body解析中间件。这就是我们的body-parser
模块的用武之地。body-parser
将提取传入请求的整个正文并将其解析为我们可以使用的 JSON 对象。
我们只需将模块放在文件顶部即可。将以下语句添加到app.js文件require
的顶部。
const bodyParser = require('body-parser');...
然后我们将告诉我们的 Express 应用程序使用body-parser
,并查找 JSON。
// Use Node.js body parsing middleware app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true, }));
另外,让我们更改消息以发送 JSON 对象作为响应而不是纯文本。
response.send({message: 'Node.js and Express REST API'});
以下是我们现在的完整app.json文件。
// Require packages and set the port const express = require('express'); const port = 3002; const bodyParser = require('body-parser'); const app = express(); // Use Node.js body parsing middleware app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true, })); app.get('/', (request, response) => { response.send({ message: 'Node.js and Express REST API'} ); }); // Start the server const server = app.listen(port, (error) => { if (error) return console.log(`Error: ${error}`); console.log(`Server listening on port ${server.address().port}`); });
如果您将 a 发送curl -i
到服务器,您将看到标头现在返回Content-Type: application/json; charset=utf-8
.
设置路线
到目前为止,我们只有GET
一条到根 ( /
) 的路由,但我们的 API 应该能够处理多个 URL 上的所有四种主要 HTTP 请求方法。我们将设置一个路由器并制作一些假数据来显示。
让我们创建一个名为routes的新目录,并在其中创建一个名为routes.js的文件。我们将在app.js的顶部链接到它。
const routes = require('./routes/routes');
请注意,.js
在 require 中不需要扩展名。现在我们将应用程序的GET
监听器移动到routes.js。在routes.js中输入以下代码。
const router = app => { app.get('/', (request, response) => { response.send({ message: 'Node.js and Express REST API' }); }); }
最后,导出,router
以便我们可以在app.js文件中使用它。
// Export the router module.exports = router;
在app.js中,将之前的代码替换为以下代码:app.get()
routes()
routes(app);
你现在应该可以去http://localhost:3002
看看和以前一样的东西了。(别忘了重启服务器!)
一旦所有这些都设置好并正常工作,我们将使用另一条路由提供一些 JSON 数据。我们现在只使用假数据,因为我们的数据库还没有建立。
让我们在routes.js中创建一个users
变量,其中包含一些 JSON 格式的假用户数据。
const users = [{ id: 1, name: "Richard Hendricks", email: "richard@piedpiper.com", }, { id: 2, name: "Bertram Gilfoyle", email: "gilfoyle@piedpiper.com", }, ];
我们将向GET
我们的路由器添加另一个路由/users
,并通过它发送用户数据。
app.get('/users', (request, response) => { response.send(users); });
重新启动服务器后,您现在可以导航到http://localhost:3002/users
并查看我们显示的所有数据。
注意:如果您的浏览器上没有 JSON 查看器扩展,我强烈建议您下载一个,例如JSONView for chrome。这将使数据更易于阅读!
访问我们的GitHub 存储库,查看这篇文章的完整代码,并将其与您自己的代码进行比较。
结论
在本教程中,我们学习了如何在 node 中设置内置 HTTP 服务器和 Express 服务器,路由请求和 URL,以及使用 get 请求使用 JSON 数据。