只是学习Sails.js,所以对我很轻松。
我查询了一个XML服务,并使用xml2js
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数据放到我的视图中进行解析。我该怎么做?
答案 0 :(得分:0)
看起来你假设调用req.end()
会给你上面开始的https.request
的回复。这有几个问题:
req.end()
用于完成对开放请求的写入,而不是获得响应。根据{{3}},返回值未指定。https.request
调用是异步的;即使req.end()
按照你想要的方式工作,在你打电话的时候也不会有回应。解决方案是将您的回复代码(即您的res.view
)放入您已编写的end
事件的处理程序中。我还建议您重构代码,以便为远程请求/响应使用不同的变量名称,以便它们不会与控制器操作中的req
和res
变量发生冲突。整个过程就像是:
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模块的内容来简化您的外部请求;这样可以避免为data
和end
编写事件处理程序。
答案 1 :(得分:0)
如果您想将json
传递给某个javascript变量:
var clientJsonVar = <%- JSON.stringify(serverSideJson)%>