2016-08-12 6 views
0

をレンダリングする前に私がしました私のルートファイルコードで、MongoDBのデータベースからの値が取り込まれる必要がある複数のドロップダウンリストを持つフォームはこのようなものです私はDBは、このようなのparamとしての機能をレンダリングするためにそれを渡すためにローカル変数に結果を置く照会する必要が出現:は、複数のマングースのクエリはビュー

res.render("viewname",{makes:makes,colors:colors....etc}); 

問題は私のビューファイルに私はのparamsのための未定義得るということです。

asynch nodejsコードの解決策はありますか?

+0

あなたはどのような実際の問題を教えてくださいできます何をお探しですか? –

+0

@ Gandalfthe問題は、メソッドをレンダリングするためのparamsが期待値で割り当てられないために送信される値だった。つまり、メソッドが呼び出してからparamsを開始する前にrenderメソッドが実行されている。 – Abdallah

答えて

0

2つの関数が同じ(親)関数内にあるとします。そのような2つのメソッドを呼び出すことはできず、必要なときに同時に結果を得ることを期待します。あなたが作ると色、または単に機能を返しますするコールバック関数とすることができる

Make.find({},function(err,allMakes){ 
    if(err){ 
     console.log("error while trying to get all makes from the database"); 
    }else{ 
     makes = allMakes; 

    Color.find({},function(err,allColors){ 
     if(err){ 
      console.log("error while trying to get all colors from the database"); 
     }else{ 
      colors = allColors; 
      methodForRender(makes, colors); 
    } 
} 

methodForRender:あなたのような方法をウロコ状ことができます。しかし、モデルファイルにそのようなメソッドを持ち、ビューをルートファイルにレンダリングするほうがよいので、コールバックが好きです。

1

MongoDB呼び出しは、非同期です。つまり、メイクや色などの値が設定されていませんbefore res.render( "viewname");が呼び出されています。非同期呼び出しをネストし、Promise.allを使用するか、またはasyncのようなライブラリを使用してDB呼び出しを並行して実行し、すべてのDBコールバックが渡される値を設定した後にのみres.renderを呼び出す必要があります景色。例えば

、あなたの通話ネストしている場合:

Make.find({}, function(err,allMakes) { 
    if (err) { 
     console.log("error while trying to get all makes from the database"); 
    } else { 
     makes = allMakes; 
    } 

    Color.find({}, function(err,allColors) { 
     if (err) { 
      console.log("error while trying to get all colors from the database"); 
     } else { 
      colors = allColors; 
     } 

     res.render("viewname",{makes:makes,colors:colors....etc}); 
    } 
} 
+0

errがtrueになった場合、makeと色が定義されないので、多分少しのエラー処理を追加してください。 – mtjhax

1

おかげで誰もこの質問に答えるに助けようとしました。

私は解決策は、作業コードは次のようになります

http://caolan.github.io/async/docs.html#.series

非同期(async)と呼ばれるnodejsモジュール使用され、解決策を見つけた:

router.get("/new",function(req,res){ 

    // get vehicles makes available in the DB 
    var makes; 
    var colors; 
    var categories; 
    var usages; 
    var registrationCenters; 
    var fuelTypes; 
    var insuranceCompanies; 
    var insuranceCoverages; 

    async.series([function(callback){ 
     Make.find({},function(err,allMakes){ 
      if(err) return callback(err); 
      makes = allMakes; 
      callback(null,allMakes); 
     }) 
    },function(callback){ 
     Color.find({},function(err,allColors){ 
      if(err) return callback(err); 
      colors = allColors; 
      callback(null,allColors); 
     }) 
    },function(callback){ 
     Category.find({},function(err,allCates){ 
      if(err) return callback(err); 
      categories = allCates; 
      callback(null,allCates); 
     }) 
    },function(callback){ 
     Usage.find({},function(err,allUsages){ 
      if(err) return callback(err); 
      usages = allUsages; 
      callback(null,allUsages); 
     }) 
    },function(callback){ 
     RegistraionCenter.find({},function(err,allCenters){ 
      if(err) return callback(err); 
      registrationCenters = allCenters; 
      console.log(allCenters); 
      callback(null,allCenters); 
     }) 
    },function(callback){ 
     FuelType.find({},function(err,allTypes){ 
      if(err) return callback(err); 
      fuelTypes = allTypes; 

      callback(null,allTypes); 
     }) 
    }, 
    function(callback){ 
     InsuranceCompanies.find({},function(err,allCompanies){ 
      if(err) return callback(err); 
      insuranceCompanies = allCompanies; 
      callback(null,allCompanies); 
     }) 
    },function(callback){ 
     InsuranceCoverages.find({},function(err,allCoverages){ 
      if(err) return callback(err); 

      insuranceCoverages = allCoverages; 
      callback(null,allCoverages); 
     }) 
    } 
    ],function(err){ 
     res.render("vehicles/new",{makes:makes,colors:colors,categories:categories,usages:usages, 
      registrationCenters:registrationCenters,fueltypes:fuelTypes,InsuranceCompanies:insuranceCompanies,insuranceCoverages:insuranceCoverages} 
     ); 
    }); 


}); 
関連する問題