Javascript 从mongodb返回数据时出现节点JS错误
我有这个功能Javascript 从mongodb返回数据时出现节点JS错误,javascript,node.js,express,Javascript,Node.js,Express,我有这个功能 const run = async () => { await LOLUserData.LOLUserData(3) const LOLUserDataResult = await LOLUserData.LOLUserData() console.log(LOLUserDataResult) await app.listen(PORT, () => { console.log(`Arena Gaming Server is listening on por
const run = async () => {
await LOLUserData.LOLUserData(3)
const LOLUserDataResult = await LOLUserData.LOLUserData()
console.log(LOLUserDataResult)
await app.listen(PORT, () => {
console.log(`Arena Gaming Server is listening on port ${PORT}!`)
})
}
它在启动时将数据发送到此函数
//=============================================================================
// [Mongoose] Get Active Sessions users data [userId, IGN, LOLSummonerId, LOLRegion] {Step (2)} {League of Legends Tracking}
//=============================================================================
const User = require('../../models/user')
const getLOLUserData = (userId) => {
// Get User data if (valid userId & IGN exsists)
User.findOne({'userId': userId, $and: [ { IGN: { $ne: '' , $exists: true} } ]})
.then(user => {
return ( [
user.userId,
user.IGN,
user.LOLRegion,
user.LOLSummonerId
])
} )
.catch(err => {
console.log(err)
})
};
exports.LOLUserData = getLOLUserData
const LOLUserDataResult=await LOLUserData.LOLUserData()
console.log(LOLUserDataResult)
应该从上一个函数返回数组,但是我得到了一个错误
TypeError:无法读取null的属性“userId”
我做错了什么?看起来像是
User.findOne()
没有找到与您的查询匹配的记录。查询已成功执行,但未找到任何结果。承诺解析为null
,表示未找到任何记录。您的then()
回调将运行,并尝试访问user.userId
,它是null.userId
,引发异常
在then()
回调中,您可能应该有这样的功能,以防止没有结果
.then(user => {
if (user) {
return [
user.userId,
user.IGN,
user.LOLRegion,
user.LOLSummonerId
]
} else {
return [] // or whatever makes sense.
}
} )
解决方案是添加回调参数并返回它
const getLOLUserData = (userId, callBack) => {
// Get User data if (valid userId & IGN exsists)
User.findOne({'userId': userId, $and: [ { IGN: { $ne: '' , $exists: true} } ]})
.then(user => {
let result = [
user.userId,
//user.IGN,
user.LOLRegion,
user.LOLSummonerId
]
return callBack(result)
})
.catch(err => {
console.log(err)
})
};
在app.js中,我可以这样使用它
await LOLUserData.LOLUserData(3, async (result) => {
console.info(result)
})
谢谢你的回答。如果我执行console.log而不是return,则记录存在,所有数据都将显示。问题是,我认为嵌套返回无法从异步调用返回值。但是,从发布的代码中获取错误消息的唯一方法是,如果变量
user
为null
,这就是错误告诉您的。