【问题标题】:Express-node server return empty array on GETExpress-node 服务器在 GET 上返回空数组
【发布时间】:2015-05-02 22:54:46
【问题描述】:
app.get('/:user/:tag', function (req, res) {
 fs.readdir( 'api'+path.sep+req.params.user, function (err, files) {
    var tweets=[];
    for (var i =1, j=files.length ; i <j; i++)
    {
          fs.readFile('api'+path.sep+req.params.user+path.sep+files[i],'utf8', function (err, data)
           {
                data=JSON.parse(data);
                if (data.tag==req.params.tag){tweets.push(data);};         
           });
    };
    res.send(tweets);
 });
});

看来问题是fs方法的回调,但我解决了很长时间。

【问题讨论】:

  • 你的 readfile 函数是异步的。您可能应该使用此功能的同步版本。
  • 你有一个竞争条件,因为fs.readFile 是异步的,这导致你的res.send 在任何读取完成之前被调用。这与您的 for 循环相同。您可能想看看全部使用async 或使用sync 版本。
  • 感谢@jungy 帮了大忙!

标签: javascript ajax node.js express callback


【解决方案1】:

是的,fs.readFile() 是异步方法,所以你的回复是空的推文。 试试这个代码

        app.get('/:user/:tag', function (req, res) {
         fs.readdir( 'api'+path.sep+req.params.user, function (err, files) {
if(files.length==0){
res.send([]);
}else{
            var tweets=[];
            for (var i =0, j=files.length ; i <j; i++)
            {
                  fs.readFile('api'+path.sep+req.params.user+path.sep+files[i],'utf8', function (err, data)
                   {
                        data=JSON.parse(data);
                        if (data.tag==req.params.tag){tweets.push(data);}; 
                        if(i==j-1){
                            res.send(tweets);
                          }        
                   });
            };
           }
         });
        });

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2019-10-02
    • 2017-05-05
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2014-03-29
    相关资源
    最近更新 更多