Sails.js将https.request中返回的json对象发送到视图

时间:2014-04-02 18:25:00

标签: javascript json api sails.js

只是学习Sails.js,所以对我很轻松。

我查询了一个XML服务,并使用xml2js

成功地对其进行了jsonified
var req = https.request(options, function(res) {

    var xml = '';
    res.on('data', function(chunk) {
        xml += chunk;
    });

    res.on('end', function () {

        var result = parseString(xml, function (err, result) {
            console.log(JSON.stringify(result)); // Position 1
        });

        return result;
    });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message); 
});

req.write(data);

var result = req.end();

        console.log('Result: ' + JSON.stringify(result)); // Position 2

res.view({ message : 'hello', result : result });

视图正常加载,<%= message %>输出hello。大。

Position1 console.log返回字符串化的json对象 - Great。

位置2 consile.log正在返回Result: true - 不太好。

我需要能够将json数据放到我的视图中进行解析。我该怎么做?

2 个答案:

答案 0 :(得分:0)

看起来你假设调用req.end()会给你上面开始的https.request的回复。这有几个问题:

  1. req.end()用于完成对开放请求的写入,而不是获得响应。根据{{​​3}},返回值未指定。
  2. https.request调用是异步的;即使req.end()按照你想要的方式工作,在你打电话的时候也不会有回应。
  3. 解决方案是将您的回复代码(即您的res.view)放入您已编写的end事件的处理程序中。我还建议您重构代码,以便为远程请求/响应使用不同的变量名称,以便它们不会与控制器操作中的reqres变量发生冲突。整个过程就像是:

    myAction: function (req, res) {
    
        // Not sure how you're setting options, so just an example
        var options = {url: 'http://example.com', ...}
    
        var request = https.request(options, function(response) {
    
            var xml = '';
            response.on('data', function(chunk) {
                xml += chunk;
            });
    
            response.on('end', function () {
    
                var result = parseString(xml, function (err, result) {
                    return res.view({ message : 'hello', result : JSON.stringify(result)});
                });
    
            });
        });
    
        request.on('error', function(e) {
            console.log('problem with request: ' + e.message); 
            res.serverError(e); 
        });
    }
    

    您可能还会考虑使用类似the docs模块的内容来简化您的外部请求;这样可以避免为dataend编写事件处理程序。

答案 1 :(得分:0)

如果您想将json传递给某个javascript变量:

var clientJsonVar = <%- JSON.stringify(serverSideJson)%>