2017-02-02 4 views
0

私のノードのjsプログラムでは、私のmongooseデータベースを調べ、コレクション内の値を見つけて返します。値は1つだけです。mongooseの外側の変数にアクセスするfind - node js

var myValueX; 
myCollection.find(function(err, post) { 
     if (err) { 
      console.log('Error ' + err) 
     } else { 
      myValueX = post[0].valuex; 
     } 
    }); 

console.log('Have access here' + myValueX); 

ここで、このfindメソッドの外側でmyValueXを使用できるようにしたいと考えています。これどうやってするの?

私は上記にconsole.logをしようとすると、私は戻って未定義の取得は、 - それは、あなたが最初に(自然に2つのオプションが、持っているfindのコールバックで割り当てられた後myValueXにアクセスするには

+0

いいえ、検索操作が完了すると、そのコールバックが発射される前に 'はconsole.log()が実行されるため、'。あなたは、あなたがやろうとしていることをするためにコードの設計を変更する必要があります。 –

答えて

0

を達成するために、この可能です)がコールバックの内部にある場合、またはmyValueXを引数としてコールバックによって呼び出される関数の内部にある場合です。

私の意見では、より良い解決策は約束を使うことです。次のように

シンプルな約束を - 使用してソリューションです:

function findPromise(collection) { 
    return new Promise((resovle, reject) => { 
     collection.find((err, post) => { 
      if (err) 
       return reject(err) 

      // if all you want from post is valuex 
      // otherwise you can send the whole post 
      resolve(post[0].valuex) 

     }) 
    }) 
} 

findPromise(collection) 
    .then((valueX) => { 
     // you can access valuex here 
     // and manipulate it anyway you want 
     // after it's been sent from the `findPromise` 
     console.log("valueX: ", valueX) 
    }) 
    .catch((err) => { 
     console.log("An error occurred. Error: ", err) 
    }) 
関連する問題