从NodeJS发送JSON照片数组

时间:2012-08-07 20:52:03

标签: javascript json node.js

长时间监听,第一次来电: - )

我是nodejs和javascript的新手,我正在努力围绕这个事件&回调模型。

我的目标:将照片数组(名称,宽度,高度,exif数据)作为JSON返回。这是必要的,以便我的应用程序可以使用JSON数组图片来实现它的魔力。

情况:我的代码似乎有效,除了事情没有按照我喜欢的顺序运行。我希望将每张图片的JSON流式传输到HTTP响应,但是我的控制台日志记录显示事情没有按照所需的顺序排列,我怀疑res.end()被过早调用。这意味着我的Web请求在响应中没有任何内容。

相关代码:

fs.readdir(readDir, function (err, files) {
    var picsInfo;
    if (err) res.writeHead(500, err.message);
    else if (!files.length) res.writeHead(404);
    else {
        res.writeHead(200, { 'Content-Type': 'application/json' });
            files.forEach(function(file) {
        console.log('easyimage');
        easyimg.info(readDir + '/' + file, function(err, stdout, stderr) {
            if (err) throw err;
            console.log(JSON.stringify(stdout));
            res.write(JSON.stringify(stdout));
        });
        });
    }
    res.end();
});

我在控制台中看到的输出显示事情没有按顺序排列(我希望每张照片都能发送到res):

easyimage
easyimage
easyimage
easyimage
easyimage
easyimage
easyimage
easyimage
easyimage
easyimage  
{"type":"JPEG","depth":"8","width":"933","height":"1400","size":"532365B","name":"6.jpg"}
{"type":"JPEG","depth":"8","width":"1400","height":"933","size":"318134B","name":"3.jpg"}
{"type":"JPEG","depth":"8","width":"1400","height":"933","size":"310927B","name":"10.jpg"}
{"type":"JPEG","depth":"8","width":"933","height":"1400","size":"258928B","name":"1.jpg"}
req.method=GET...
{"type":"JPEG","depth":"8","width":"1400","height":"928","size":"384475B","name":"7.jpg"}
{"type":"JPEG","depth":"8","width":"933","height":"1400","size":"469711B","name":"4.jpg"}
{"type":"JPEG","depth":"8","width":"1400","height":"933","size":"392666B","name":"2.jpg"}
{"type":"JPEG","depth":"8","width":"1400","height":"933","size":"354468B","name":"5.jpg"}
{"type":"JPEG","depth":"8","width":"1400","height":"933","size":"438143B","name":"9.jpg"}
{"type":"JPEG","depth":"8","width":"933","height":"1400","size":"304939B","name":"8.jpg"}

我尝试过使用我发现的一些例子(例如http://blog.nakedjavascript.com/going-evented-with-nodejs但是我认为我在事件/回调模型方面缺少一些关键点。任何指针或帮助非常感谢。另外,如果我在这里的方法(即将JSON发送到res等)是愚蠢的或次优的,我也会喜欢一些可能最好的提示。

提前感谢任何指针&帮助!

1 个答案:

答案 0 :(得分:0)

好的,我无法运行代码,因此可能需要进行一些调整:

fs.readdir(readDir, function(err, files) {
    var filesPath = files.map(function(file) {
      return readDir + '/' + file;
    });

    async.map(filesPath, easyimg.info, function(err, json) {
        if(err)
            return res.end(500, err.message);

        res.end(JSON.stringify(json));
    });
});

您的代码出了什么问题?

  • 正如我之前所说,res.end()被立即调用,因为easyimg.info异步回答。
  • 您为每个文件调用easyimg.info,但无法保证响应按顺序到达。查看精彩的async lib(npm install async)。
  • 当您使用回调返回错误时,请确保您也返回。始终使用模式return cb(err)