【问题标题】:Mongoose: CastError: Cast to ObjectId failed for value “me” at path “_id”Mongoose:CastError:在路径“_id”处为值“me”转换为 ObjectId 失败
【发布时间】:2019-11-10 12:42:19
【问题描述】:

我知道这个问题有很多版本,但我找不到任何帮助我的东西。

function isAuthenticated() {
  return compose()
    // Validate jwt
    .use(function (req, res, next) {
      // allow access_token to be passed through query parameter as well
      if (req.query && req.query.hasOwnProperty('access_token')) {
        req.headers.authorization = 'Bearer ' + req.query.access_token;
      }
      validateJwt(req, res, next);
    })
    // Attach user to request
    .use(function (req, res, next) {
      User.findById(req.user._id, function (err, user) {
        console.log(next);
        if (err) {
          return next(err);
        }
        if (!user) {
          return res.send(401);
        }
        req.user = user;
        next();
      });
    });
}

这是错误:

CastError: Cast to ObjectId failed for value "me" at path "_id"
    at ObjectId.cast (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongoose\lib\
schema\objectid.js:116:13)
    at ObjectId.castForQuery (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongo
ose\lib\schema\objectid.js:165:17)
    at Query.cast (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongoose\lib\que
ry.js:2317:32)
    at Query.findOne (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongoose\lib\
query.js:1118:10)
    at Function.findOne (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongoose\l
ib\model.js:1049:13)
    at Function.findById (C:\Users\Benoit\Desktop\Gakusei\node_modules\mongoose\
lib\model.js:986:15)
    at Object.exports.show [as handle] (C:\Users\Benoit\Desktop\Gakusei\server\a
pi\user.js:43:8)
    at next_layer (C:\Users\Benoit\Desktop\Gakusei\node_modules\express\lib\rout
er\route.js:103:13)
    at next (C:\Users\Benoit\Desktop\Gakusei\node_modules\composable-middleware\
lib\composable-middleware.js:40:9)
    at Promise.<anonymous> (C:\Users\Benoit\Desktop\Gakusei\server\auth\auth.ser
vice.js:37:9)

我正在修改一些 Yeoman 样板身份验证代码,但我没有触及这部分。任何线索将不胜感激。

为了完整性,这里是我的“我”的 api

exports.me = function (req, res, next) {
  var userId = req.user._id;
  User.findOne({
    _id: userId
  }, '-salt -hashedPassword', function (err, user) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.json(401);
    }
    res.json(user);
  });
};

【问题讨论】:

    标签: node.js mongodb authentication express mongoose


    【解决方案1】:

    您正试图通过查询 _id 等于“我”来访问具有 findOne 的对象。 Mongoose 尝试将字符串“me”转换为 ObjectId,但失败了。我无法从回溯中判断问题是否是您的 me 函数(这是您提供的代码中唯一使用 findOne 的地方),但您可以尝试将函数调用更改为 User.findById(userId, ...) .但是,不明白为什么 userId 等于“我”,或者这是否会有所帮助。希望这至少给了你一些方向。如果您仍有问题,请添加评论。

    【讨论】:

    • @Benoit 这有帮助吗?
    【解决方案2】:

    这是一个老问题,但由于我遇到了同样的问题并解决了这个问题,我想发帖以供将来参考。

    你得到这个错误是因为你放了

    router.get("/:id", controller code)
    

    之前

    router.get("/me", controller code)
    

    您应该始终将特定路线放在通用路线之前。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2020-05-11
      • 2021-03-13
      • 2014-06-20
      • 2017-05-19
      • 2017-11-10
      • 2019-01-06
      • 2016-05-06
      • 1970-01-01
      相关资源
      最近更新 更多