【问题标题】:mongoose findOne dosen`t return anything猫鼬 findOne 不会返回任何东西
【发布时间】:2019-01-17 21:08:34
【问题描述】:

在 UsersSchema 中,我定义了一个函数来从数据库返回一个对象,知道 decoded._idtokens.token

UserSchema.statics.findByToken = function(token) {
  var User = this;
  var decoded;

  try {
      decoded = jwt.verify(token, 'abc123');
  } catch (e) {

      return Promise.reject();
  }

  return User.findOne({
    '_id': decoded._id,
    'tokens.token': token,
    'tokens.access': 'auth'
  });
};

由于某种原因,findOne 函数返回 null,尽管具有该 ID 的对象存在于数据库中。

【问题讨论】:

  • 我猜jwt.verify 是异步的并返回一个Promise。在使用该值之前,您应该等待它完成。
  • 进行查询时,decoded 值可用。我查过了。

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

我认为这是因为您没有等待异步查询解决

试试这个,

UserSchema.statics.findByToken = async function(token) {
  var User = this;
  var decoded;

  try {
      decoded = jwt.verify(token, 'abc123');
  } catch (e) {

      return Promise.reject();
  }

  return await User.findOne({
    '_id': decoded._id,
    'tokens.token': token,
    'tokens.access': 'auth'
  });
};

【讨论】:

  • 它在做同样的事情......返回null......但是,这只发生在我使用超测测试套件发出请求时,并且当我在浏览器中发出请求时完美运行......
  • 测试工具通常有一个超时时间,之后即使您没有收到响应,它也会关闭连接。尝试增加超时时间。
  • 我确实将超时时间增加到 5 秒,它挂了 3 秒,然后告诉我没有找到用户。
  • 嗯,我看不出它在浏览器上工作而不在测试工具上工作的任何其他原因。你确定其他一切都一样吗?另一个可能的问题可能是您将 decoded._id 作为字符串发送,其中您需要作为对象 ID 发送, mongoose.Types.ObjectId(decoded._id) 只需检查传递给 mongo 的数据是否有任何差异两种情况(浏览器和测试工具)
  • 我发布的代码 sn-p 用于测试套件和普通浏览器请求。我的猜测是测试套件如何通过标头中的令牌有问题。我从数组中获取令牌并且它崩溃了,但是如果我手动输入令牌它不会。很奇怪。如果你想查看它,我在 github 上有完整的应用程序,除此之外,我无法继续测试应用程序...
【解决方案2】:

完成!解决了!我更新了 mongoose 版本,该版本具有重大更改,并且功能在其他模块中开始失败。我用新的替换了那些,它可以工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2020-12-21
    • 2018-09-03
    • 2019-03-25
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多