如何在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 ,我们可以安装项目所需的依赖项了。 幸运的是,我们不需要太多的依赖关系,只需下面列出的这四个即可。
- body-parser :主体解析中间件。
- express :我们将用于服务器的极简Web框架。
- mysql :一个MySQL驱动程序。
- request (可选):进行HTTP调用的一种简单方法。
我们将在每个依赖项之后使用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**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和“您好,服务器!”。 信息。
app.get('/', (request, response) => {
console.log(`URL: ${request.url}`);
response.send('Hello, Server!');
});
最后,我们将使用listen()
方法在端口3002
上启动服务器。
// 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.json文件中的scripts
属性以自动运行此特定命令。
"scripts": {
"start": "node app.js"
},
现在,我们可以使用npm start
启动服务器,并且我们将在终端中看到服务器消息。
Server listening on port 3002
如果在URL上运行curl -i
,我们将看到它现在由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-parser
模块进入的地方body-parser
body-parser
将提取传入请求的整个主体,并将其解析为我们可以使用的JSON对象。
我们只需要在文件顶部添加模块即可。 将以下require
语句添加到app.js文件的顶部。
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}`);
});
如果将curl -i
发送到服务器,您将看到标题现在返回Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
。
设定路线
到目前为止,我们只有到根( /
)的GET
路由,但是我们的API应该能够处理多个URL上的所有四个主要HTTP请求方法。 我们将设置一个路由器,并显示一些假数据。
让我们创建一个名为routes的新目录,以及一个名为routes.js的文件。 我们将在app.js的顶部链接到它。
const routes = require('./routes/routes');
请注意,在require中不需要.js
扩展名。 现在,我们将应用程序的GET
侦听器移动到route.js 。 在route.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数据。 由于我们的数据库尚未建立,我们现在仅使用伪数据。
让我们在route.js中创建一个users
变量, 其中包含一些JSON格式的虚假用户数据。
const users = [{
id: 1,
name: "Richard Hendricks",
email: "richard@piedpiper.com",
},
{
id: 2,
name: "Bertram Gilfoyle",
email: "gilfoyle@piedpiper.com",
},
];
我们将向路由器/users
添加另一个GET
路由,并通过发送用户数据。
app.get('/users', (request, response) => {
response.send(users);
});
重新启动服务器后,您现在可以导航到http://localhost:3002/users
并查看显示的所有数据。
注意:如果浏览器上没有JSON查看器扩展,强烈建议您下载其中的一个,例如JSONView for Chrome。 这将使数据更易于阅读!
访问我们的GitHub Repo以查看此帖子的完整代码,并将其与您自己的代码进行比较。
结论
在本教程中,我们学习了如何在节点中设置内置的HTTP服务器和Express服务器,路由请求和URL,以及通过get请求使用JSON数据。
在RESTful API系列的最后一部分中,我们将Express服务器连接到MySQL,以在数据库中创建,查看,更新和删除用户,从而完成API的功能。