长时间监听,第一次来电: - )
我是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等)是愚蠢的或次优的,我也会喜欢一些可能最好的提示。
提前感谢任何指针&帮助!
答案 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)
。