2

我一直在尝试使用 node.js 的 MongoJS 驱动程序检索数据。我正在使用的代码如下

     req.on('end', function(){
             var decodedBody = querystring.parse(fullBody);
             story=decodedBody.name;
             var z=new Array();
             console.log(story);
         res.writeHead(200,{'Content-Type': 'text/html'});
         res.write('<html><body>');
             db.frames.find({str_id:story}).toArray(function(err,doc){
             console.log(doc);
             for(var t=0;t<doc.length;t++)
                 {
                     var picid=doc[t].pic_id;
                     console.log(picid);               
                     db.pictures.find({_id:picid}).toArray(function(err,pic){
                      res.write('<img src="'+pic[0].name+'"/>');
             });
           } 
        }) 
        res.end('</body></html>'); 
   });

这里的问题是,由于代码的异步性质,响应首先结束,然后数据库块内的代码被执行,因此浏览器上没有显示任何内容,即在这种情况下是图像。提前谢谢。

4

2 回答 2

3

不要对抗 node.js 的异步特性,拥抱它!

因此,您应该触发所有请求,并在响应到达时将每个请求标记为已完成。完成所有请求后,呈现您的图像和 body/html 结束标记。

我通常不使用 node.js,所以我可能会犯一些错误,但它可能看起来像这样:

res.write('<html><body>');
db.frames.find({str_id:story}).toArray(function(err,doc){
  console.log(doc);

  var completed = {};

  for(var t = 0; t < doc.length; t++) {
    var picid = doc[t].pic_id;
    completed.picid = false;
    console.log(picid);               
    db.pictures.find({_id: picid}).toArray(function(err, pic) {
      // mark request as completed
      completed.picid = pic;


      // check if all requests completed
      var all_finished = true;
      for(var k in completed) {
        if(completed[k] === false) {
          all_finished = false;
          break;
        }
      }

      // render final markup
      if(all_finished) {
        for(var k in completed) {
          var pic = completed[k];
          res.write('<img src="'+pic[0].name+'"/>');
        }
        res.end('</body></html>);
      }
    });


  } 
}) 
于 2012-10-18T07:05:09.947 回答
1

只是把res.end('</body></html>');你的db.frames.find功能里面。检查何时到达doc.length - 1,然后发送end命令。

于 2012-10-18T07:01:53.303 回答