![](/img/trans.png)
[英]Meteor HTTP.call undefined on Client-side, working on Server-side
[英]Meteor HTTP.call on server side correct using?
對不起我的英語不好。 我是初學者JS開發人員。 我需要流星的幫助。 我嘗試編寫rss聚合器。 您能告訴我為什么此代碼對我來說無法正常工作嗎? rssContent始終是未定義的。 但是,如果我嘗試在HTTP.call中使用console.log(result.content),我會看到rss數據。 我需要在此文件的另一個函數中傳遞rssContent來解析XML,但是我在使用HTTP.call時遇到麻煩
server.js代碼:
var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];
var rssContent;
for (var i = 0; i < rssSources.length; i++) {
HTTP.call('GET', rssSources[i],
function(error, result) {
try {
rssContent = result.content;
} catch (e) {
console.log(e);
}
}
);
}
console.log(rssContent);
您的rssContent
變量始終是未定義的,因為您正在回調(async)非阻塞方法中調用它。 代替回調方法,您必須使用sync(blocking)方法。 我建議您,不要給全局變量賦值,每當您收到http請求的響應時,就直接將數據插入數據庫中。
阻止示例:-
var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];
var rssContent = "";
for (var i = 0; i < rssSources.length; i++) {
var result = Meteor.http.call("GET", rssSources[i]);
if(result.statusCode == '200' && result.content){
rssContent += result.content;
}
}
console.log(rssContent);
非阻塞示例:-
var rssSources = ['http://news.yandex.ru/auto.rss'],
for (var i = 0; i < rssSources.length; i++) {
HTTP.call('GET', rssSources[i],
function(error, result) {
try {
//HERE INSERT YOUR DATA INTO THE DATABASE.INSTEAD OF ASSIGNING THE VALUE TO GLOBAL VARIABLE.
} catch (e) {
console.log(e);
}
}
);
}
在Meteor中有兩種運行HTTP請求的方式。 默認情況下,它同步運行。 如果傳遞回調,則它將異步運行。 在這種情況下,假設這是服務器端代碼,則可以更容易地省略回調並將其視為同步的(IMO會少很多)。
var rssContent = [];
for (var i = 0; i < rssSources.length; i++) {
var result = HTTP.call('GET', rssSources[i]);
// error handling
resultContent.push(result);
}
我對處理同步版本的錯誤不熟悉。 您可以在此處查看其文檔中的更多詳細信息 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.