Javascript 如何使用nock返回响应的对象而不是字符串?
当我使用存根请求时,它返回Javascript 如何使用nock返回响应的对象而不是字符串?,javascript,node.js,request,fakeweb,nock,Javascript,Node.js,Request,Fakeweb,Nock,当我使用存根请求时,它返回字符串结果,而不是对象,即使使用“Content-Type”:“application/json”: var response = { success: true, statusCode: 200, body: { "status": "OK", "id": "05056b27b82", } }; Test.BuildRequest(); Test.SendRequest(done); nock('https://someapi.co
字符串
结果,而不是对象
,即使使用“Content-Type”:“application/json”
:
var response = {
success: true,
statusCode: 200,
body: {
"status": "OK",
"id": "05056b27b82",
}
};
Test.BuildRequest();
Test.SendRequest(done);
nock('https://someapi.com')
// also tried
// .defaultReplyHeaders({
// 'Content-Type': 'application/json',
// 'Accept': 'application/json'
// })
.post('/order')
.reply(200, response.body,
'Content-Type': 'application/json',
'Accept': 'application/json');
检查:
console.log(put.response.body);
console.log(put.response.body.id);
输出:
{"status":"OK","id":"05056b27b82"}
undefined
在代码中,我使用request
模块返回具有相同数据的Object
。我也尝试了sinon
(对我不起作用)和fakeweb
,但也遇到了同样的问题
我要测试的代码:
var request = require('request');
// ...
request(section.request, function (err, response, body) {
if (err || _.isEmpty(response))
return result(err, curSyndication);
//if (_.isString(body))
// body = JSON.parse(body);
section.response.body = body;
console.log(body.id); // => undefined (if uncomment previous code - 05056b27b82)
_this.handleResponse(section, response, body, result);
});
它在实际请求中返回一个对象
PS。我可以在响应处理程序中添加下一个代码:
if (_.isString(body))
body = JSON.parse(body);
但有些查询返回xml字符串,我不负责这些更改
伪造网站:
fakeweb.registerUri({
uri: 'https://someapi.com/order',
body: JSON.stringify({
status: "OK",
id: "05056b27b82",
}),
statusCode: 200,
headers: {
'User-Agent': 'My requestor',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
Test.SendRequest(done);
同样的结果
更新:
我读了几篇文章,它们使用JSON对象,但没有对其进行解析(使用nock),因此它应该返回JSON对象,与请求库的返回方式相同。您的nock配置没有问题,但是您没有告诉
请求
将响应解析为JSON
从文档中(以我为重点):
json
-将body but设置为值的json表示形式,并添加内容类型:application/json header此外,将响应正文解析为JSON。
回调参数获取3个参数:
- 适用时出现错误(通常来自http.ClientRequest对象)
- http.IncomingMessage对象
- 第三个是响应主体(字符串或缓冲区,如果提供了
选项,则为JSON对象)JSON
部分将json
属性设置为true
。请求对象:
var request = require('request');
// ...
section.request.json = true;
request(section.request, function (err, response, body) {
//..
});
nock返回JSON。要转换为对象,您需要使用JSON.parse
-->将JSON转换为对象,我更新了答案。模块返回一个对象它返回一个对象。您是否在部分指定了json
选项。请求对象?那么您的代码中是否有section.request.json=true
?因为request
需要“另外,将响应体解析为JSON”。这就解决了我的问题,谢谢!您可以发布奖励的答案。感谢您提供完整的答案,启用后我将奖励奖励。