【问题标题】:Why is this DB function returning undefined? [duplicate]为什么这个 DB 函数返回未定义? [复制]
【发布时间】:2021-01-14 02:43:47
【问题描述】:

我正在尝试创建一个可以轻松调用我的 MongoDB 的函数。

这是功能代码/处理程序:

let get = {};

get.getGuildData = (id) => {
    const guildData = require('./models/guilds.js')
    guildData.findById(id).then(async (data) => {
    return guildData.findById(id)
    })
};

module.exports = { get }

这是我调用函数的地方:

const getGuild = bee.get.getGuildData(msg.guildID)
console.log(getGuild)

它返回 undefined,但实际函数上的 console.log 返回正确的东西:

如果有人知道这个问题的解决方案,请告诉我。

无法在这篇文章中找到答案。 How do I return the response from an asynchronous call?

【问题讨论】:

  • 另外,注意comma operator返回最后一个操作数,所以data,console.log('returned data:',data)会返回console.log的返回值,即undefined
  • getGuildData 没有 return 任何东西。其中的嵌套函数有一个return 语句,但这与getGuildData 本身返回的内容无关。
  • @Bee 您无法返回数据,因为它还不存在。你可以返回一个承诺。 guildData.findId(id) 已经创建了一个将解析数据的承诺,所以你的函数的最后一行应该是 return guildData.findById(id)
  • @NicholasTower 我只是把它放入并运行它,仍然返回未定义。
  • 是的,不,同样的问题。你只想要(id) => { const guildData = require(...); return guildData.findById(id); }。仅此而已。

标签: javascript node.js mongoose eris


【解决方案1】:

您无法返回数据,因为它还不存在。你能做的就是回报一个承诺。 guildData.findById(id) 显然已经返回了一个解析为数据的承诺,因此您无需在其上调用 .then 来创建新的承诺。

get.getGuildData = (id) => {
  const guildData = require('./models/guilds.js')
  return guildData.findById(id);
};

由于该函数现在返回一个 Promise,任何调用它的代码都需要使用 Promise。要么按承诺致电.then

bee.get.getGuildData(msg.guildID)
  .then(data => {
    console.log(data);
  });

或者,如果您在异步函数中,请使用 await:

async function someFunction() {
  const data = await bee.get.getGuildData(msg.guildID);
  console.log(data);
}

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 2020-12-25
    • 1970-01-01
    • 2018-03-08
    • 2016-09-24
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多