将 Mongoose DB 中的值添加到 Node.js 中的变量中
Posted
技术标签:
【中文标题】将 Mongoose DB 中的值添加到 Node.js 中的变量中【英文标题】:Adding a value from Mongoose DB into a variable in Node.js 【发布时间】:2020-10-19 23:13:46 【问题描述】:我对 Node.js 还是很陌生,似乎找不到任何可以帮助我解决这个问题的方法。 我在从最后一条记录中获取查询并将其添加到我的变量时遇到问题。
如果我像下面这样:-
let lastRecord = Application.find().sort($natural:-1).limit(1).then((result) => result );
然后我得到console.log中显示的变量值:-
Promise <pending>
我需要做什么才能将其正确输出到我的完整数据中?
【问题讨论】:
【参考方案1】:这里是固定的:
Application.findOne().sort($natural:-1).exec().then((lastRecord) =>
console.log(lastRecord); // "lastRecord" is the result. You must use it here.
, (err) =>
console.log(err); // This only runs if there was an error. "err" contains the data about the error.
);
几件事:
-
您只获得一条记录,而不是很多记录,因此您只需使用
findOne
而不是find
。因此,您也不再需要 limit(1)
。
您需要调用.exec()
才能实际运行查询。
结果在回调函数内部返回给你,这里必须使用。
exec()
返回一个 Promise。 javascript 中的 Promise 基本上只是一个容器,其中包含将在未来某个时间完成的任务。它有then
方法,它允许你绑定函数以便它在完成时调用。
每当您使用 JavaScript 到另一台服务器获取一些数据时,代码都不会停止并等待数据。它实际上继续向前执行而无需等待。这称为“异步”。然后在数据回来的时候就回来运行then
给的函数。
异步是一个简单的词,用于描述一个函数,当您调用它时将开始执行,但代码将继续向前运行而不等待它完成。这就是为什么我们需要为它提供某种功能,以便稍后在数据返回时执行。这称为“回调函数”。
这里有很多要解释的,但是请去研究一下 JavaScript Promises 和异步性,这会更有意义。
编辑:
如果这是在函数内部,您可以这样做:
async function someFunc()
let lastRecord = await Application.findOne().sort($natural:-1).exec();
注意函数前的async
。这必须我在那里才能让await
工作。但是,如果您还不了解 Promise,则此方法有点难以理解。我建议您从我的第一个建议开始,并在您完全理解 Promise 后逐步使用 async/await
语法。
【讨论】:
好的,谢谢,但请原谅我对此的无知,因为我对此有点动摇,但是您将如何从该回调函数之外检索结果?但你说得对,我需要对此进行进一步研究 @JamLizzy101 你没有。这就是 JavaScript 应该如何工作的。您必须将使用该变量的任何逻辑移动到回调函数中。 让我试试【参考方案2】:您需要await
记录而不是使用.then()
。例如:
let lastRecord = await Application.find().sort($natural:-1).limit(1);
您可以在 MDN entry for await 中了解有关等待承诺的更多信息,但基本情况是,要使用来自承诺的响应,您可以使用 await 或将您的逻辑放入 .then
语句中。
【讨论】:
您不知道他是否在函数中,因此他可能需要将其包装在某个东西中以将async
放在上面。从表面上看,我认为他们甚至不了解 Promise 是什么。以上是关于将 Mongoose DB 中的值添加到 Node.js 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章
将新字段添加到集合的所有文档中,将文档字段中的值添加到 MongoDB (Mongoose) 中,记录为 300K+
在 Node/Mongoose/Express 中保持 DB 数据属性私有