Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 为什么Array.some()不返回true?_Javascript_Node.js_Mongoose - Fatal编程技术网

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

Javascript 为什么Array.some()不返回true?,javascript,node.js,mongoose,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 => {

我试图找出用户是否已经提出了请求。下面的路由器使用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的用户是否已经是成员,如果不是,我检查他是否已经提出了请求

在中尝试此代码段将按预期返回true

const array = [ { status: 0, user: '5dd69677de9b1e3484de78af' } ];
console.log(array.some((element) => element.user == '5dd69677de9b1e3484de78af'));
上面的数组描述了我得到的实际响应。我已经记录了userID和request.user,以确保它们实际上是相同的。我已经记录了请求数组、整个列表以及其间的所有内容。在some函数中用字符串替换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

[ { status: 0, user: 5dd69677de9b1e3484de78af } ]
我猜,
req.user
是string,但您试图将string与mongo\u id值进行比较,后者不是string类型

也许,尝试将这两个值强制转换为字符串

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

当然,仅当根据您的代码片段,
userID
确实存在时

[ { status: 0, user: 5dd69677de9b1e3484de78af } ]
我猜,
req.user
是string,但您试图将string与mongo\u id值进行比较,后者不是string类型

也许,尝试将这两个值强制转换为字符串

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

当然,只有当
userID
确实存在时,才显示您的(listing.requests)data@PrakashKarena我已经更新了帖子。正如我所说的,代码片段中的数组几乎就是我在实际应用中得到的输出app@NinaScholz在这种情况下,listing.members也应该为空,但这与检查请求用户是否具有身份验证令牌一样有效。如果是这样,则转发用户ID显示您的(listing.requests)data@PrakashKarena我已经更新了帖子。正如我所说的,代码片段中的数组几乎就是我在实际应用中得到的输出app@NinaScholz在这种情况下,listing.members也应该为空,但这与检查请求用户是否具有身份验证令牌一样有效。如果是这样的话,用户的ID会被转发,这实际上起了作用。我确信==会将类型转换为nevessary。@ZitroOne
=======
会这样做。@reporter根据MDN==转换为通用类型,而===比较类型和值,因此我仍然很困惑为什么它最初不起作用,但是whatever@Zitrooone正确的说法是,
==
执行转换,而
==
不执行转换。但是,不清楚您拥有的数据-
5dd69677de9b1e3484de78af
不是有效数字,因为JS没有将数值格式化为十六进制。我的猜测是,它是一个自定义类型(因此,是一个对象),只是打印出来看起来像一个数字。由于您通过
toString()
处理打印值,因此调用
request.user.toString()
将生成原语值
“5dd69677de9b1e3484de78af”
。如果
userID
属于同一类型,则其上的
toString()
将生成一个等价的基本字符串,然后compared@VLAZ它是一个ObjectID,因此实际上是一个自定义类型。然而,我认为松散的比较会将两者转换为字符串(我认为来自json主体的用户ID应该已经是字符串)。接下来,我将默认在比较之前将ID转换为字符串,以避免我自己的另一个头痛…这确实起到了作用。我确信==会将类型转换为nevessary。@ZitroOne
=======
会这样做。@reporter根据MDN==转换为通用类型,而===比较类型和值,因此我仍然很困惑为什么它最初不起作用,但是whatever@Zitrooone正确的说法是,
==
执行转换,而
==
不执行转换。但是,不清楚您拥有的数据-
5dd69677de9b1e3484de78af
不是有效数字,因为JS没有将数值格式化为十六进制。我的猜测是,它是一个自定义类型(因此,是一个对象),只是打印出来看起来像一个数字。由于您通过
toString()
处理打印值,因此调用
request.user.toString()
将生成原语值
“5dd69677de9b1e3484de78af”
。如果
userID
属于同一类型,则其上的
toString()
将生成一个等价的基本字符串,然后compared@VLAZ它是一个ObjectID,因此实际上是一个自定义类型。然而,我认为松散的比较会将两者转换为字符串(我认为来自json主体的用户ID应该已经是字符串)。接下来,我将默认在比较之前将ID转换为字符串,以避免我自己的另一个头痛。。。