这里给出一个完整的攻略,分为以下几个方面:
路由
路由(Routing)是实现不同URL请求的分发处理,将不同的请求分配到对应的处理程序中,以便实现特定的功能。
在Node.js中,路由可以使用自带的模块http
中的createServer
方法来实现,通过request
对象中的url
和method
属性可以获取当前请求的URL和请求方法,并根据不同的URL和请求方法进行分配到对应的处理程序。例如:
const http = require('http');
function router(request, response) {
// 获取请求的URL和请求方法
const url = request.url;
const method = request.method;
// 根据URL和请求方法分配到不同的处理程序
if (url === '/' && method === 'GET') {
// 处理GET请求并返回响应
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<h1>Hello, world!</h1>');
} else {
// 处理未定义的路由
response.writeHead(404, {'Content-Type': 'text/html'});
response.end('<h1>404 Not Found</h1>');
}
}
http.createServer(router).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
我们设置两个路由:
- 根路由:
'/'
,GET请求,返回Hello, world!
; - 未定义的路由:其他请求,返回
404 Not Found
。
这里有一个示例2中的路由设置到一个Express应用程序中。
const express = require('express');
const app = express();
const router = express.Router();
// 根路由
router.get('/', (req, res) => {
res.send('<h1>Hello, world!</h1>');
});
// 未定义的路由
router.all('*', (req, res) => {
res.status(404).send('<h1>404 Not Found</h1>');
});
app.use(router);
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
使用Express的路由器(Router)类,我们通过router.get
和router.all
方法分别设置了根路由和未定义的路由,二者分别对应了Node.js中的根路由和未定义路由的处理逻辑。
中间件
中间件(Middleware)是指在请求和响应之间进行一系列处理的函数。这些函数封装了对请求和响应的处理逻辑,可以用来完成诸如日志记录、请求处理、权限验证等诸多功能。
在Node.js中,中间件可以使用自带的模块http
中的createServer
方法来实现,通过使用request
对象中的url
和method
属性进行请求和响应的处理。例如:
const http = require('http');
function logger(request, response, next) {
const date = new Date().toISOString();
console.log(`[${date}] ${request.method} ${request.url}`);
next();
}
function hello(request, response) {
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<h1>Hello, world!</h1>');
}
http.createServer((request, response) => {
logger(request, response, () => {
hello(request, response);
});
}).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
我们定义了两个中间件:
logger
:打印请求时间、请求方法和请求URL,然后交给下一个中间件或路由进行处理;hello
:返回响应Hello, world!
。
这个示例2中的中间件将输出到控制台一条日志信息,指示所有HTTP方法和对应的URL。使用了morgan
中间件(记录请求日志)。这个中间件将捕获每个HTTP请求的IP地址、HTTP方法、请求URL、查询字符串,处理时间和响应的状态。最后,它将把这个日志消息打印到控制台:
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('dev'));
app.get('/', (req, res) => {
res.send('<h1>Hello, world!</h1>');
});
app.all('*', (req, res) => {
res.status(404).send('<h1>404 Not Found</h1>');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
这个示例中使用了morgan
中间件,并通过app.use
方法将中间件集成到Express应用程序中。这个中间件定义了记录请求日志的规范配置('dev'
)。它将捕获每个HTTP请求的IP地址、HTTP方法、请求URL、查询字符串,处理时间和响应的状态。最后,它将把这个日志消息打印到控制台。
GET请求
在Node.js中,处理GET请求可以使用http
模块的createServer
方法和request
对象的url
属性来获取请求的URL,通过URL参数来获取请求此的参数,例如querystring
模块的parse
方法可以将URL参数解析成对象的形式,然后进一步进行处理。例如:
const http = require('http');
const querystring = require('querystring');
function router(request, response) {
const url = request.url;
if (url.indexOf('/api/data') === 0) {
// 获取URL中的参数
const query = url.split('?')[1];
const params = querystring.parse(query);
// 返回处理结果
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({
code: 0,
message: 'Success',
data: params
}));
} else {
response.writeHead(404, {'Content-Type': 'text/html'});
response.end('<h1>404 Not Found</h1>');
}
}
http.createServer(router).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
我们设置了一个路由'/api/data'
,GET请求,通过querystring
模块的parse
方法解析URL参数,并返回处理结果。
这里有一个示例2中的GET请求到一个Express应用程序中。
const express = require('express');
const app = express();
app.get('/api/data', (req, res) => {
const params = req.query;
res.json({
code: 0,
message: 'Success',
data: params
});
});
app.all('*', (req, res) => {
res.status(404).send('<h1>404 Not Found</h1>');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
使用Express的app.get
方法设置路由,请求的参数可以通过req.query
属性来获取,这个属性类似querystring
模块的parse
方法解析URL来获取参数。
POST请求
在Node.js中,处理POST请求需要使用http
模块的createServer
方法、request
对象的on
方法来绑定data
和end
事件,获取POST请求发送的数据,并进行处理。例如:
const http = require('http');
const querystring = require('querystring');
function router(request, response) {
if (request.url.indexOf('/api/data') === 0 && request.method === 'POST') {
let postData = '';
// 通过监听data事件和end事件获取POST请求的数据
request.on('data', chunk => {
postData += chunk;
});
request.on('end', () => {
// 将POST请求的数据解析成对象
const params = querystring.parse(postData);
// 返回处理结果
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({
code: 0,
message: 'Success',
data: params
}));
});
} else {
response.writeHead(404, {'Content-Type': 'text/html'});
response.end('<h1>404 Not Found</h1>');
}
}
http.createServer(router).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
我们设置了一个路由'/api/data'
,POST请求,通过request
对象的on
方法来绑定data
和end
事件,获取POST请求发送的数据,并通过querystring
模块的parse
方法解析POST请求的数据,然后返回处理结果。
这里有一个示例2中的POST请求到一个Express应用程序中。
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.post('/api/data', (req, res) => {
const params = req.body;
res.json({
code: 0,
message: 'Success',
data: params
});
});
app.all('*', (req, res) => {
res.status(404).send('<h1>404 Not Found</h1>');
});
app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
使用Express的app.post
方法设置路由,需要在Express应用程序中使用express.json
和express.urlencoded
中间件将POST请求的数据解析成对象。可以通过req.body
属性来获取POST请求的参数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js中路由,中间件,get请求和post请求的参数详解 - Python技术站