在Express.js中解析JSON响应主体

时间:2016-07-07 20:49:34

标签: javascript json node.js express

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

2 个答案:

答案 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}}