0

長年のリスナー、初めての発信者:-)

私は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に送信するなど)が馬鹿げているか最適ではない場合は、何が最善かについてのヒントも気に入っています。

ポインタとヘルプを事前に感謝します!

4

1 に答える 1

0

OK、コードを実行できないので、微調整が必​​要になる場合があります。

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ますが、応答が順番に到着するという保証はありません。すばらしい非同期lib(npm install async)を参照してください。
  • コールバックでエラーを返す場合は、必ず返すようにしてください。常にパターンを使用してreturn cb(err)ください。
于 2012-08-07T20:55:46.323 に答える