为什么在 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()
,然后才能使用它。
我正在使用 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()
,然后才能使用它。