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”。这就解决了我的问题,谢谢!您可以发布奖励的答案。感谢您提供完整的答案,启用后我将奖励奖励。