为什么在 HapiJS 上 h.response return 是字符串而不是对象?

Why h.response return a string instead of object on HapiJS?

我正在使用 TDD 使用 HapiJS 创建一个 API 我收到一个错误,因为测试验证了请求的有效负载,奇怪的是,我收到了一个字符串而不是文档中所说的对象。

这是我用@hapi/lab写的测试:

it('payload should be a json object', async () => {
    const res = await server.inject({
      method: 'GET',
      url: '/users'
    })
    console.log(res)
    expect(res.payload).to.be.object()
  })

这是我的路线:

server.route({
  method: 'GET',
  path: '/users',
  handler: (request, h) => {
    const data = {
      message: 'App'
    }

    const response = h
      .response(data)
      .type('application/json')
      .header('content-type', 'application/json')
      .code(200)
    
    return response
  }
})

顺便说一句,测试中的console.log是为了确认res.payload的内容,并验证它接收的是字符串而不是对象。

这是我从测试中得到的具体错误: Expected '{"message":"App"}' to be an object but got 'string'

您要查找的 属性 是 result,在您从 inject 方法获得的 response 对象上。

payload 是来自端点的数据,因为 hapi 将发送到客户端,这意味着它是序列化的。这就是你得到一个字符串的原因。相反,result 属性 是序列化之前从端点返回的原始数据。您可以在 return 部分的 documentation 中找到更多信息。

下面是一个代码片段来展示这一点:

const Hapi = require("@hapi/hapi");

const server = Hapi.Server();

server.route({
  method: "GET",
  path: "/test",
  options: {
    handler(req, h) {
      return { result: 1 };
    },
  },
});

(async function () {
  await server.start();

  console.log("server started");

  const res = await server.inject({
    method: "GET",
    url: "/test",
  });

  console.log(res.payload); // ==> '{"result": 1}'
  console.log(res.result); // ==> { result: 1 }
})();

还要回答您的评论之一,您实际上已经从 hapi 服务器发送了一个对象。只是数据被序列化了。您需要在调用端点的任何上下文中反序列化它,例如 JSON.parse(),然后才能使用它。