2017-10-17 27 views
0

Node expressとmongodbを使用しています。私はショーページのすべての関連プロパティをループすることができるようにしようとしています。私のコードは、そのコードTypeError:未定義のプロパティ 'ref'を読み取れません。 Express

Desktop.find({}, function(err, allDesktop) { 
      if(err){ 
       console.log(err); 
      } else { 
       console.log(allDesktop); // #1 
       res.locals.desktops = allDesktop; // Set the data in locals 
      } 
     }); 
     console.log("res.locals.desktops: ", res.locals.desktops); //#2 

あるルートの一部であり、#1 console.logは正しいすべての結果をログアウトします。しかしconsole.log#2はundefinedを返します。どうしてこれなの?私は同じ経路で他の場所でも同じように設定したことを知っていますが、代わりにres.locals.laptops

ここでは何が分かりますか?

+0

'Desktop.find'は同期関数です。呼び出しの直後に結果を使用することはできません。 'console.log'の最初の呼び出しが正しいデータを出力しますが、2番目の' undefined'が出力されるため、結果はコールバックで利用可能です。 – alexmac

+0

'Desktop.find()'が実行されていますが、DBが結果を返すときにコールバックが実行される前に 'console.log()'に移動します。返される前に結果を出力しようとしています。コールバックの中で 'console.log()'を動かしてください。 – doublesharp

答えて

1

これはEvent Loopと関連しています。要するに、Desktop.find()が実行されますが、が完了すると、がわかりません。

あなたのコールバックが再生される場所は、function(err, allDesktop) {}です。 Desktop.find()が実行を終了するとコールバックが呼び出されます。

したがって、コードは上から下に評価され、res.locals.desktopsundefinedになります。このような何かはあなたの問題を解決する必要があります。

Desktop.find({}).exec() 
    .then(allDesktop => { 
     res.locals.desktops = allDesktop 
     return Promise.resolve() 
    }) 
    .then(() => { 
     console.log(res.locals.desktops) 
    }) 
    .catch(err => console.error(err)) 

.exec()は、本質的にPromiseあるMongooseThenableを返します。

+0

あなたの入力に誤字があります 'allDesktops'は' allDesktop'でなければなりません – doublesharp

+0

また、約束事に変換する必要はありません。元の例とコールバックを使って全く同じことをすることができます – doublesharp

+0

@doublesharp何ですか? 'allDesktop'は存在するすべての場所で全く同じです。 'res.local'には' desktops'がありますが、 'allDesktops'は決してありません。 –

関連する問題