为什么Array.some()不返回true?

时间:2020-01-30 11:52:04

标签: javascript node.js mongoose

我正在尝试确定用户是否已经发出请求。下面的路由器使用Array.some()函数查找用户ID,但始终返回false。

router.post('/requests/myStatus', auth, (req, res) => {
  const userID = req.user
  const listing = req.body.listing
  try {
      Listing.findOne({ _id: listing }).then(listing => {
        if (listing.members.includes(userID)) {
          res.status(200).send({ msg: 'Joined' })
        } else if (listing.requests.some(request => request.user == userID)) {
          res.status(200).send({ msg: 'Requested' })
        } else {
          res.status(200).send({ msg: 'Empty' })
        }
    })
  } catch (error) {
    res.status(404).send(error)
  }
})

我找到了所需的列表,并检查ID为X的用户是否已经是成员,如果不是,请检查他是否已发出请求。

MDN console中尝试此代码段将按预期返回true。

const array = [ { status: 0, user: '5dd69677de9b1e3484de78af' } ];
console.log(array.some((element) => element.user == '5dd69677de9b1e3484de78af'));

上面的数组描述了我得到的实际响应。我已经记录了userID以及request.user,以确保它们实际上是相同的。我已经记录了请求数组,整个清单以及两者之间的所有内容。用some函数中的ID替换为字符串的userID也无济于事。我和我的同事不知所措...

猫鼬模式的相关部分:

const listingSchema = mongoose.Schema({
  members: [{
    type: mongoose.Schema.Types.ObjectId, ref: 'Profile'
   }],
  requests: [{
    _id: false,
    user: {
      type: mongoose.Schema.Types.ObjectId, ref: 'Profile'
     },
    status: {
      type: Number, // 0 - pending | 1 - accepted | 2 - declined | 3 - withdrawn | 4 - expired
      default: 0
    }
   }]
});

任何帮助将不胜感激。在此先感谢:)

编辑:根据要求,listing.requests输出:

[ { status: 0, user: 5dd69677de9b1e3484de78af } ]

编辑2:将比较的ID转换为字符串解决了该问题。谢谢@Grynets

1 个答案:

答案 0 :(得分:1)

根据您的代码段

[ { status: 0, user: 5dd69677de9b1e3484de78af } ]

我猜想req.user是字符串,但是您正在尝试将字符串与mongo _id值进行比较,该值不是string类型。

也许尝试将两个值都转换为字符串?

listing.requests.some(request => request.user.toString() == userID.toString())

当然,只有真正存在userID