Node.js / Express.js应用程序对另一个应用程序进行RESTful调用,并在响应中接收JSON。但是JSON响应没有被解析为新变量。 需要对下面的代码进行哪些具体更改,以便可以将JSON正文成功解析为接收Node.js / Express.js应用程序可用于进一步处理的新变量?
以下是Node.js / Express.js代码,目前正在接收JSON
body
response
:
var url = require('url');
var request = require('request');
app.get('/user**', function(req, res) {
console.log("You Hit The User Route TOP");
request.get(authServer + '/uaa/user', function (error, response, body) {
if(error){console.log('ERROR with user request.')}
if (!error){// && response.statusCode == 200) {
console.log(response.statusCode); console.log(body);
response.on('data', function(chunk){
console.log('inside response.on(data...)');
body += chunk;
});
response.on('end', function(){
console.log('inside response.on(end...)');
body = JSON.parse(body);
var text = '';
for (var key in body){
text += 'Index is: ' + key +
'\nDescription is: ' + body[key]
}
// The Description is: "descriptive string"
console.log("Got a response: ", text);
res.send(text);
});
res.send(body);
};
}).auth(null, null, true, bearerToken);//this inserts bearer token in the GET request
console.log("You Hit The User Route BOTTOM");
});
以下是代码中显示的nodemon
的{{1}}日志。 请注意,永远不会调用GET
块,因为它们的SYSO永远不会打印:
response.on()
这里是格式化和截断的You Hit The User Route TOP
You Hit The User Route BOTTOM
200
{ long JSON string, which is formatted and truncated below for easier reading }
GET /user 200 182.862 ms - 1296
JSON
,它说明了需要解析为Node.js / Express.js JavaScript变量的数据格式:
body
答案 0 :(得分:5)
问题是你的行为好像body
是一个逐渐给你JSON的流,但你已经向自己证明了你的第一个if (error) {
console.log('ERROR with user request.')
return res.sendStatus(500);
}
body = JSON.parse(body);
var text = '';
for (var key in body) {
text += 'Index is: ' + key + '\nDescription is: ' + body[key]
}
// The Description is: "descriptive string"
console.log("Got a response: ", text);
res.send(text);
语句并不是这样。相反,您可以立即解析var result = DataSource.Sql(query, parameters).ToInt32().Execute();
并开始处理它。您还可以简化请求处理程序。
var result = DataSource.Sql(query, parameters).ToInt32List().Execute().Single;
答案 1 :(得分:1)
以下行不会等待您的响应被解析。
res.send(body);
将其删除并等待您的response.on('end')
事件回复。
我会以不同的方式构建您的请求。您没有流式传输您的回复,因此没有太多理由倾听回复事件。此外,您可以通过让请求通过指示返回的正文是JSON来为您处理JSON.parse()
来消除您对request({
method: 'GET',
url: authServer + '/uaa/user',
json: true, // indicates the returning data is JSON, no need for JSON.parse()
auth: {
user: null,
password: null,
sendImmediately: true,
bearer: bearerToken
}
}, function (error, response, body) {
if(error){
console.log('ERROR with user request.');
return res.sendStatus(500); // Return back that an error occurred
}
else {
console.log(response.statusCode);
console.log(body);
var text = '';
for (var key in body) {
text += 'Index is: ' + key + '\nDescription is: ' + body[key];
}
return res.status(200).send(text);
}
});
的需求。
{{1}}