📅  最后修改于: 2023-12-03 15:01:06.529000             🧑  作者: Mango
在 Hapi.js 中,我们可以通过 request.payload
属性来访问请求主体。请求主体包含了请求发送时携带的数据,比如表单数据、JSON 数据等等。本文将深入介绍如何在 Hapi.js 中使用请求主体。
获取请求主体非常简单,只需要访问 request.payload
属性即可。以下是一个例子:
server.route({
method: 'POST',
path: '/api/users',
handler: (request, h) => {
const user = request.payload;
// do something with user
return h.response('User created').code(201);
}
});
上面的例子中,我们定义了一个 POST 请求,当客户端发送一个包含用户信息的请求主体时,我们可以通过访问 request.payload
来获取这些信息,并进行后续的处理。
当我们发送一个表单时,请求主体的格式是 application/x-www-form-urlencoded
。在 Hapi.js 中,通过使用 hapi-payload-utilities
插件,我们可以很容易地解析这种类型的请求主体。
const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const Vision = require('@hapi/vision');
const HapiSwagger = require('hapi-swagger');
const Pack = require('./package');
const PayloadUtilities = require('hapi-payload-utilities');
(async () => {
const server = await new Hapi.Server({
host: 'localhost',
port: 3000
});
await server.register([
Inert,
Vision,
{
plugin: HapiSwagger,
options: {
info: {
title: 'API Documentation',
version: Pack.version
}
}
},
{
plugin: PayloadUtilities
}
]);
server.route([
{
method: 'POST',
path: '/api/users',
handler: (request, h) => {
const user = request.payload;
// do something with user
return h.response('User created').code(201);
},
options: {
payload: {
output: 'data',
parse: true,
allow: ['application/x-www-form-urlencoded']
}
}
}
]);
await server.start();
console.log(`Server running at ${server.info.uri}`);
})();
当我们发送 JSON 数据时,请求主体的格式是 application/json
。在 Hapi.js 中,我们可以通过使用 hapi-bodyparser
插件来解析 JSON 类型的请求主体。
const Hapi = require('@hapi/hapi');
const Inert = require('@hapi/inert');
const Vision = require('@hapi/vision');
const HapiSwagger = require('hapi-swagger');
const Pack = require('./package');
const BodyParser = require('hapi-bodyparser');
(async () => {
const server = await new Hapi.Server({
host: 'localhost',
port: 3000
});
await server.register([
Inert,
Vision,
{
plugin: HapiSwagger,
options: {
info: {
title: 'API Documentation',
version: Pack.version
}
}
},
{
plugin: BodyParser
}
]);
server.route([
{
method: 'POST',
path: '/api/users',
handler: (request, h) => {
const user = request.payload;
// do something with user
return h.response('User created').code(201);
}
}
]);
await server.start();
console.log(`Server running at ${server.info.uri}`);
})();
在实际的项目中,我们通常需要验证请求主体的内容是否符合我们的期望。在 Hapi.js 中,我们可以使用 joi
模块来进行验证。以下是一个例子:
const Joi = require('@hapi/joi');
const userSchema = Joi.object().keys({
name: Joi.string().required(),
email: Joi.string().email().required()
});
server.route({
method: 'POST',
path: '/api/users',
handler: (request, h) => {
const user = request.payload;
const { error } = Joi.validate(user, userSchema);
if (error) {
return h.response(error.details[0].message).code(400);
}
// do something with user
return h.response('User created').code(201);
}
});
上面的例子中,我们首先定义了一个 userSchema
对象,用来描述我们期望的用户信息。然后,在 POST 请求中,我们使用 Joi.validate()
方法来验证请求主体是否符合我们的期望,如果不符合,我们返回 400 错误。