gpt4 book ai didi

Javascript异步等待不等待 Mongoose 等待

转载 作者:行者123 更新时间:2023-11-30 11:11:02 27 4
gpt4 key购买 nike

我正在尝试将数据库调用移出我的 Controller 以清理内容并使它们可测试。当他们在 Controller 中时,一切都会顺利进行。我将它们移出 Controller 并添加了异步以确保我们等待。否则,我会在 Users.findOne().exec() 中调用 res.render() 函数。现在,一旦我使用 async/await,我的 Controller 中的函数就会认为没有用户,因为它没有在等待。

SO 上有几个关于异步等待的问题,但我没有找到可以解决我的问题的问题。我确实验证了我的用户已返回,并且我添加了控制台日志以显示路径。

  • > node mongoose async await看起来很有希望,但他们的实际问题是未能返回,而我的返回很好
  • > async not waiting for await是 Kotlin 的问题
  • > async await not waiting似乎非常适用,但我不完全理解有关嵌套等待/异步的答案 - 提问者遇到的问题比我的查询更复杂,因为他们正在处理循环和 forEach
  • > Javascript async await是正确的,所以我检查了 mongoose 函数是否返回了一个 promise 。 Mongoose 文档显示它已准备好进行异步,因为调用会返回一个 promise 。

假设我们正在解析路由 /users

routes/index.js

// requires & other routes not shown 
router.get('/users', controller.testUserShow);

controllers/index.js

// requires & other routes not shown 
exports.testUserShow = async (req, res, next) => {
if (req.user) { // if code to get user is right here, with no async/await, the user is found and the code continues
try {
found = await services.fetchUser(req.user._id)
console.log("I am not waiting for at testusershow")
console.log(found); //undefined
// go on to do something with found
} catch(e) {
throw new Error(e.message)
}
}
}

services/index.js

const db = require('../db')
exports.fetchUser = async (id) => {
try {
console.log("fetchUser is asking for user")
return await db.returnUser(id)
} catch(e) {
throw new Error(e.message)
}
}

db/index.js

const User = require('../models/user');
exports.returnUser = async (id) => {
User.findById(id)
.exec(function(err, foundUser) {
if (err || !foundUser) {
return err;
} else {
// if this was in the controller
// we could res.render() right here
console.log("returnUser has a user");
console.log(foundUser); // this is a User
return foundUser;
}
});
}

控制台日志去

fetchUser is asking for user
I am not waiting for at testusershow
undefined
returnUser has a user
// not printed... valid user

如果我正在调用未返回 promise 的内容,我希望初始调用是未定义的,但 User.findOne() 应该。

我在这里错过了什么?

最佳答案

这是最简单的方法:

const User = require('../models/user');
exports.returnUser = (id) => {
return User.findById(id).exec().then(foundUser => {
console.log(foundUser); // this is a User
return foundUser;
});
}

如果你想使用 async/await 那么你可以这样做:

    exports.returnUser = async id => {
const foundUser = await User.findById(id).exec();
console.log({foundUser});
return foundUser;
});
}

如果你想使用回调,它看起来像:

exports.returnUser =  (id, cb) => {
return User.findById(id).exec(cb);
}

关于 Mongoose 的一个很酷的想法是,如果您不传递回调,它将从 exec 函数/方法返回一个 promise 。

关于Javascript异步等待不等待 Mongoose 等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53688901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com