2017-09-02 21 views
2
var config = require('config.json'); 
var mongo = require('mongoskin'); 
var db = mongo.db(config.connectionString, { native_parser: true }); 

module.exports.getNextSequence = function (name) { 
    var temp; 
    db.collection("counters").findAndModify(
     { _id: name },   // query 
     [],      // represents a sort order if multiple matches 
     { $inc: { seq: 1 } }, // update statement 
     { new: true },   // options - new to return the modified document 
     function (err, doc) { 
      temp = doc.value.seq; 
      console.log(temp); // <-- here the temp is getting printed correctly 
     } 
    ); 
    return temp; 
} 

上記のコードを使用して、​​の値を返すことができません。 console.log(obj.getNextSequence)を実行すると、undefinedが印刷されます。NodejsとMongoDB:関数から値を返すことができません

​​の値を返す関数が必要です。

答えて

1

私はmongoskinに慣れていないので正解ではありませんが、データベースクエリは通常非同期ですので、コールバックを介して照会された値にアクセスする必要があります。

"getNextSequence"関数は、データベースクエリが完了する前(つまり、 "temp = doc.value.seq"ステートメントの前)に "temp"変数を返すと思います。 getNextSequenceに渡されたコールバック内から "TEMP" にアクセスすると

module.exports.getNextSequence = function (name, callback) { 
    var temp; 
    db.collection("counters").findAndModify(
     { _id: name },   // query 
     [],      // represents a sort order if multiple matches 
     { $inc: { seq: 1 } }, // update statement 
     { new: true },   // options - new to return the modified document 
     function (err, doc) { 
      temp = doc.value.seq; 
      callback(temp); 
     } 
    ); 
} 

すると、このような何かを試してみてください。

1

findAndModifyは、非同期の機能です。 console.log行は、の後にを実行すると、tempを返します。したがって、undefinedになります。これを機能させるには、あなた自身の非同期アプローチを使用したいと思うでしょう。あなたの状況には2つの方法があります。

Callbacks

あなたはすでにあなたがfindAndModifyの最後の引数として提供され、コールバックを使用しています。あなたがこのアプローチを拡張し、次のように、あなた自身のコールバックにこれを養うことができます:もちろん

module.exports.getNextSequence = function (name, callback) { 
    db.collection("counters").findAndModify(
     { _id: name }, 
     [], 
     { $inc: { seq: 1 } }, 
     { new: true }, 
     function (err, doc) { 
      if (err) { 
       return callback(err); 
      } 

      callback(null, doc.value.seq); 
     } 
    ); 
} 

を、これはgetNextSequenceにコールバックを渡すためにあなたを必要とし、上流のコールバックパターンに従います。また、エラーをmongoskinから処理して、独自の処理を行うこともできます。

Promises:あなたはfindAndModifyへのコールバックを提供しない場合は、次のように

が、それは、あなたができるチェーンへの上に、約束を返します。

module.exports.getNextSequence = function (name) { 
    return db.collection("counters").findAndModify(
     { _id: name }, 
     [], 
     { $inc: { seq: 1 } }, 
     { new: true } 
    ).then(function (doc) { 
     return doc.value.seq; 
    }); 
} 

を繰り返しますが、これはあなたが必要になります上流の約束パターンに従うこと。上記の例では取り上げていないエラーを正しく処理できるように、このアプローチを選択すると、約束を読みたいかもしれません。

関連する問題