异步/等待函数在undefined上产生

时间:2017-10-01 20:09:12

标签: node.js mongodb asynchronous mongoose async-await

我遇到了异步功能问题。我正在使用mongodb进行查询(使用mongoose),当我尝试获取信息时,它会产生undefined。

这是我对db的查询(嵌套在函数中):

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'。 然而,当我只运行查询功能并提出console.log(tick)而不是return 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();

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的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;
      }
    }
  );
}

答案 1 :(得分:0)

只需发布promesified 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的评论中已经讨论过并记录过这些答案!我只是想把它留在那里以防它帮助别人!

再次感谢您的宝贵帮助!