2017-10-01 15 views
0

非同期関数に問題があります。私はmongodbに(mongooseを使って)問い合わせを行い、情報を取得しようとすると、未定義になります。ここで非同期/待機関数が未定義で生成される

は(関数内にネスト)デシベルに私のクエリです:

function kquery() { 
    Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 

、ここでは私の非同期は/機能を待っています:

async function compare() { 
    var ktick = await kquery(); 
    console.log(ktick); 
} 

compare(); 

は、これらの関数は、同じファイル内の両方であり、とき私はそれを実行し、私に'undefined'を与えます。 ながら、私は、クエリ機能を実行し、代わりにreturn tickconsole.log(tick)を置くとき、私は正しい情報を得る:

{ _id: 59d1199cdbbcd32a151dcf21, 
    mk: 'kraken', 
    c: 430900, 
    n: 1506875804217 } 

は、私が思うに、私はどこかにコールバックをめちゃくちゃにしていますが、私はありませんよどこまたはどのようにしてください。あなたの助けを事前に

const mongo = require('mongodb'); 
const mongoose = require('mongoose'); 
mongoose.Promise = global.Promise; 
const server = mongoose.connect('mongodb://localhost/cryptoCollection', { 
    useMongoClient: true 
}); 

//Loading the mongoose schema: 
const { Krakentick } = require('./kraken/model/krakenModel'); 
var now = Math.floor(new Date()); 

function kquery() { 
    Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 


async function compare() { 
    var ktick = await kquery(); 
    console.log(ktick); 
} 

compare(); 

ありがとう: ここでは完全なファイルです!参考までpromesified kquery機能を掲示

function kquery() { 
    return Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 
+2

私はasync/await関数を読んでいます: "_その関数が実際には' undefined'を返すからです.... Soooo ....質問は何ですか?その関数が何かを返すことになっている場合は、何かを返さなければなりません。または、戻り値ではなくログ出力を意味しますか?あなたは 'kQuery'を待つことができません、それは何も返されません!待つ約束はない!あなたの 'wait'ステートメントは直ちに' undefined '戻り値を待っています。あなたは 'Krakentick.findOneの前で' return'を忘れたように見えますか?関数が約束を返すか、それが助けにならないことを願っています。 –

+2

[非同期呼び出しからの応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Frxstrem

+0

ちょっとメレル!私の 'kquery()'関数の中で、ダンプを返すことになっていた関数の中で、非同期/待機関数 'compare'を使ってログに記録しますか? – Ardzii

答えて

3

あなたkquery機能は約束を返さなければなりません

function kquery() { 
    return new Promise((resolve, reject) => { 
    Krakentick.findOne(
     { 
     iname: 'btcusd', 
     n: { $lt: now } 
     }, 
     'mk c n', 
     function(err, tick) { 
     if (err) { 
      reject(err); 
     } else { 
      resolve(tick); 
     } 
     } 
    ); 
    }); 
} 

それが議論され、以前に文書化されていたが、受け入れ答えは、上記のものでしたMörreのコメントで!それが誰かを助ける場合に備えて、ただそこに残したかったのです!

貴重なご支援をいただき、ありがとうございます。

関連する問題