2016-10-25 6 views
0

NodeJS、Mongo、Expressの新機能を使用しているので、簡単な質問のように思えます。私はと比較しようとしているNodejs、Express、Mongo:ループ内のコールバック関数が無視されています

着信データは、以下の構造を有する:データが入ってくるよう

key1: {value1} key2: {value2} key3: {value3}

私が何をしようとしているが、各キーを選択し、配列をループでありますmongoの "assets"コレクションでそのキーと一致するドキュメントを検索します。一致するものがある場合は、受信データの{value1}とmongo内の一致の{valueStored}を比較します。ここで

は私のコードです: `

app.all('/css', function(req, res, next) { 
    if (req.url === "/favicon.ico"){ 
    res.sendStatus(200); 
    res.end(); 
    } 

    var time = Math.floor(new Date()/1000); 
    var cssFiles = req["body"]["css_information"]["css"]; 
    var collection = database.collection("assets"); 
    for (key in cssFiles){ 
    if (cssFiles.hasOwnProperty(key)){ 
     console.log("key outside find(): "+key); 
     // key above is cycling through properly, but key inside find() is stuck on last one 
     // so it isn't cycling through properly, and only searches for the last one everytime. 
     database.collection("assets").find({"path":key}).sort({"timestamp_changed" : -1}).limit(1).toArray(function (err, docs){ 
     console.log("--docs inside find(): "+JSON.stringify(docs[0], null,4)); 
     console.log("key inside find(): "+key); 
     if (docs[0] != null){ 
      // console.log(JSON.stringify(docs[0]["css"], null, 4)); 
      var lastCSS = docs[0]["css"]; 
      if(lastCSS !== cssFiles[key]){ 
      database.collection("assets", function(err, col3) { 
       collection.updateOne({"parent":"css", "timestamp_changed":time, "path":key,"css":cssFiles[key]}, 
          {$set:{"path":key} }, 
          {upsert: true, multi: false}); 
       // database.close(); 
      }); 
      }else{ 
      console.log("no changes"); 
      //end of if lastCSS === cssFiles[key] statement 
      } 
     }else{ 
      console.log("Key: "+key); 
      database.collection("assets", function(err, col3) { 
      collection.updateOne({"parent":"css", "timestamp_changed":time, "path":key,"css":cssFiles[key]}, 
         {$set:{"path":key} }, 
         {upsert: true, multi: false}); 
      }); 
     //end of if (doc[0] != null) statement 
     } 
     //end of find() callback 
     }); 
    }else{ 
     console.log("cssFiles ¬hasOwnProperty(key)"); 
    } 
//end of for loop 
    } 
res.status(200).json({data:"RETURN STATUS"}).end(); 
}); 

`

私は、コードを実行すると、それは次のように出力されます

key outside find(): themes/seven/reset.css 
key outside find(): themes/seven/style.css 
key outside find(): sites/all/modules/ctools/css/ctools.css 
key outside find(): modules/dblog/dblog.css 
key outside find(): modules/overlay/overlay-child.css 
key outside find(): sites/all/modules/panels/css/panels.css 
key outside find(): modules/system/system.base.css 
key outside find(): modules/system/system.admin.css 
key outside find(): modules/system/system.menus.css 
key outside find(): modules/system/system.messages.css 
key outside find(): modules/system/system.theme.css 
key outside find(): sites/all/modules/date/date_api/date.css 
key outside find(): modules/field/theme/field.css 
key outside find(): modules/node/node.css 
key outside find(): modules/search/search.css 
key outside find(): modules/user/user.css 
key outside find(): sites/all/modules/views/css/views.css 
executed 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 
key inside find(): sites/all/modules/views/css/views.css 

私が見つける()コードを取得するにはどうすればよいです正しいキーを使用し、毎回最後のキーに固執しないでください。それとも私はこれに完全に間違ってアプローチしましたか?

答えて

1

JavaScriptは非同期であるため、各クエリはループの終了後に実行されるため、最後のキー(ループ実行ごとに変更されます)で実行されます。

ヨはあなたの鍵をコピーし、コピーしてクエリを実行する必要があります。

let localKey = key; 
database.collection("assets").find({"path":localKey}).sort(<etc with localKey instead of key> 
+0

PS:結果として、あなたのログは任意の合理的な順序であることを期待していない:それはどのくらいの時間に依存しますそれぞれの別の呼び出しに応答するためにDB/net /何にでもかかります! – dgiugg

+0

私はキーワード 'let'の意味を理解していませんでした。私は同様のものを試してみましたが、もう一度 'var'を使っていましたが、明らかに何も変えていませんでした。 「let」をサポートしていないノードのバージョンもありましたので、私はそれを更新しました。 – winegums008

+1

私は見る!私は、それが見つかったすべてのキーを比較する限り、その注文が重要ではないと思います。 find()は、ドキュメントが作成されるたびに挿入されるキー値のペアであるタイムスタンプ上でソートしているため、問題ではありません。また、私の評判は、私のアップヴォートのために低いです。でもありがとう :) – winegums008

関連する問題