Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从mongodb返回数据时出现节点JS错误_Javascript_Node.js_Express - Fatal编程技术网

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
,这就是错误告诉您的。