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

Sails.js Sending json object returned in https.request to the view

本文关键字:对象 json 视图 返回 js https request Sails      更新时间:2023-09-26

只是在学习帆.js所以对我放轻松。

我查询了一个 XML 服务,并使用 xml2js 成功对其进行了 json化

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。伟大。

位置 1 控制台.log 正在返回字符串化的 json 对象 - 太好了。

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

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

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

  1. req.end()用于完成对打开的请求的写入,而不是获取响应。 根据文档,返回值未指定。
  2. https.request调用是异步的;即使req.end()按您希望的方式工作,在您调用它时也不会收到响应。

解决方案是将您的响应代码(即您的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); 
    });
}

您还可以考虑使用类似 Request 模块的东西来简化外部请求;这将使您不必为 dataend 编写事件处理程序。

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

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