我想制作一个快速的Util文件,其中应包含多个功能,例如user_id用作其名称。如下图所示,我试图在整个代码中保存该值,但是由于某些原因,变量“名称”在.then(user => {})
内部没有受到影响
我尝试不使用变量来直接返回值来保存它。
我进行了调试,代码运行正常,它完美地进入了if(!user){}else{}
。
Mongoose返回的用户可以工作,并且我可以控制台登录user.username(无法返回它,也可以将其保存到变量中,这就是我在下面的代码中所做的事情)
const User = require('../models/users')
exports.id2name = (id) => {
let name = 'none'
User.findOne({_id: id}).then(user => {
if (!user) {
name = 'Unknown'
} else {
name = user.username
}
}).catch(err => console.log(err))
return name
}
我的控制台上没有任何错误。即使返回到猫鼬请求内的else语句中,它的结果也将返回“ none”。
答案 0 :(得分:2)
对于JavaScript的异步行为,您得到此结果。
您可以尝试使用此代码来获得所需的结果。
exports.id2name = async (id) => {
try{
let name = 'none'
const user = await User.findOne({_id: id});
if(user) {
name = user.username;
} else {
name = 'Unknown';
}
return name;
} catch(e) {
console.log(e);
}
}
答案 1 :(得分:0)
这是异步返回。我的意思是您可能需要使用回调,Promise或其他异步方式来处理它,例如:
const User = require('../models/users')
exports.id2name = (id, callback) => {
User.findOne({_id: id}).then(user => {
if (!user) {
callback(null, 'Unknown')
} else {
callback(null, user.username)
}
}).catch(callback)
}
或承诺:
const User = require('../models/users')
exports.id2name = (id) => {
return new Promise((resolve, reject) => {
User.findOne({_id: id}).then(user => {
if (!user) {
resolve('Unknown')
} else {
resolve(user.username)
}
}).catch(reject);
});
}