📜  hapijs 中的请求主体 - Javascript (1)

📅  最后修改于: 2023-12-03 15:01:06.529000             🧑  作者: Mango

Hapi.js 中的请求主体

在 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 数据

当我们发送 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 错误。