使用NodeJs在express中执行render之前等待异步操作

时间:2015-12-07 23:58:46

标签: node.js asynchronous express

我最近开始使用NodeJs,并且我正在尝试创建一个API,它将从Web获取一些信息并将其编译并显示给用户。

我的问题是以下

router.get('/', function (req, res, next) {
  https.get(pageUrl, function (res) {
     res.on('data', function (responseBuffer) {
         //Important info;
        info = responseBuffer;
     }
   }

   res.render('page', { important: info});
 }

我怎么能等到我有" info" var然后发送res.render。因为现在如果我试着等待,通常程序结束并且不等待结果。

感谢。

1 个答案:

答案 0 :(得分:4)

假设您的https.get来电为您提供了一个包含'end'事件 [1] 的信息流,您可以执行以下操作:

router.get('/', function (req, res, next) {
  https.get(pageUrl, function (res) {
     var info;

     res.on('data', function (responseBuffer) {
         //Important info;
        info = responseBuffer;
     }

     res.on('end', function() {
       res.render('page', { important: info});
     })
   }
 }

请注意,上述代码无效,因为您使用res回调中的res参数隐藏了基本https.get参数。

另请注意,'data'事件可能会多次发出(同样,假设标准流实现 [1] ),因此您应该在{{1}中累积结果变量。

[1] 您能否发布有关您的代码的更多信息,例如info库的来源(它是标准的HTTPS库吗?)。

个人想法:我强烈建议使用request module,通过https对NPM提出异议,以获取对外部服务的HTTP(S)请求。它有一个简洁的界面,易于使用并为您处理很多情况(重定向是一个例子,JSON和npm install request另一个)。