2017-01-15 10 views
-1

私は2つのmysqlクエリを取得します.1つはグループ番号を取得し、1はそのグループのすべてのドアを表示します。今私は私のgroupnumbersを取得するとき、私はなぜ私は私の配列上にマップ行くrrayにそれらを取得します。Node.jsの後に書いてください

しかし、私はこれを使用すると、誰かに送信した後にエラーを書くことができないのですが、これをどのように修正できるかを知っていますか?最初の要素はres.end()とレスポンスを閉じ、次のいずれかが応答に書き込もうとすると、それができないように

app.post("/door",function (req,res) { 
    var door = req.body.door; 

    Data(door,function (data) { 
     res.writeHead(200, {'content-type': 'text/json' }); 
     res.write(JSON.stringify(data)); 
     res.end(); 
    }); 

}); 


function Data(door,next) { 
    db.getGroups(function (e,groups) { 
     if (e) console.log(e); 
     else { 
      async.map(groups,function (d) { 
       db.getDoorD(d.GroupNumber,door,function (e,data) { 
        next(data); 
       }); 
      }); 
     } 
    }); 
} 

答えて

1

あなたのマップ機能は、配列の各要素を反復します。

ここにはいくつかのオプションがありますが、好きなのはasync.jsライブラリです。すなわち、このようなものに見えるだろう。この場合

app.get("/door",function (req,res) { 
db.getGroups(function (e,groups) { 
    if(e) console.log(e); 
    else 
    { 
     async.map(groups, db.getDoorD, function (err,results) { 
       res.writeHead(200, {'content-type': 'text/json' }); 
       res.write(JSON.stringify(results)); 
       res.end(); 
      }); 
     }); 
    } 
}); 
}); 

を、getDoorD機能は、変換された入力オブジェクトまたは配列にコールバックを発行する、とresults配列は、最終的な変換を持つことになります。

あなたはここにあなたのSQLを投稿していませんが、あなたがここにいるN + 1のクエリを実行する必要がないように、より良いSQLクエリが作成される可能性もあります。他にも演奏者。

+0

ありがとうございますが、依然として同じ問題 – nodeMan

+0

あなたは私のコード例に従っていません。私が非同期バージョンのmapを指摘したのは、反復関数でコールバックを持っていることに注意してください。それが呼び出されるたびに、データを次のデータに渡す必要があります。外部関数でnextを呼び出すと、前と同じように毎回同じロジックを呼び出そうとします。 – Paul

関連する問題