Mongodb转换错误:URL的一部分被发送到_id,如何从请求中获取id

ie3xauqp  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(158)

我一直在谷歌和StackOverflow上搜索,这个错误已经存在了相当长的一段时间,但没有一个提出的解决方案适合我的问题。
我有一个端点

router.get('/posts/me', authController.isLoggedIn, catchErrors(blogController.myPosts))

查看此用户的帖子
在控制器上,我有:

exports.myPosts = async (req, res) => {

    const posts = await Post.findById({author: {$eq: req.user._id}})

    res.json({'response':posts.length > 0 ? posts : 'You have no blog posts ☹️ ',
              'status':200})

}

Mongo返回一个奇怪的错误:

CastError: Cast to ObjectId failed for value "{ _id: 'me' }" at path "_id" for model "Post"

其中'me'是URL的最后一部分。如果我更改,错误的这一部分也会更改。
我不想按ID查找帖子,我需要查找作者ID等于req.user_.id的所有帖子
$where的操作符在我的atlas层是无效的,我读到它并不是真的有效。问题是我如何克服这个错误,并得到一个用户创建的所有帖子的列表?
完整的错误消息:

CastError: Cast to ObjectId failed for value "{ _id: 'me' }" at path "_id" for model "Post"
    at new CastError (F:\test\Projects\test\Backend\node_modules\mongoose\lib\error\cast.js:29:11)
    at ObjectId.cast (F:\test\Projects\test\Backend\node_modules\mongoose\lib\schema\objectid.js:244:11)
    at ObjectId.SchemaType.applySetters (F:\test\Projects\test\Backend\node_modules\mongoose\lib\schematype.js:948:12)
    at ObjectId.SchemaType._castForQuery (F:\test\Projects\test\Backend\node_modules\mongoose\lib\schematype.js:1362:15)
    at ObjectId.SchemaType.castForQuery (F:\test\Projects\test\Backend\node_modules\mongoose\lib\schematype.js:1352:15)
    at ObjectId.SchemaType.castForQueryWrapper (F:\test\Projects\test\Backend\node_modules\mongoose\lib\schematype.js:1331:15)
    at cast (F:\test\Projects\test\Backend\node_modules\mongoose\lib\cast.js:252:34)
    at model.Query.Query.cast (F:\test\Projects\test\Backend\node_modules\mongoose\lib\query.js:4607:12)
    at model.Query.Query._castConditions (F:\test\Projects\test\Backend\node_modules\mongoose\lib\query.js:1790:10)
    at model.Query.<anonymous> (F:\test\Projects\test\Backend\node_modules\mongoose\lib\query.js:2045:8)
    at model.Query._wrappedThunk [as _findOne] (F:\test\Projects\test\Backend\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8)
    at process.nextTick (F:\test\Projects\test\Backend\node_modules\kareem\index.js:369:33)
at process._tickCallback (internal/process/next_tick.js:61:11)

我正在使用passport.js处理身份验证

exports.isLoggedIn = (req, res, next) =>{
    if(req.isAuthenticated()){
        return next();
    }
    res.status(401).json({'online':false, 
              'message':'Oops you must be logged in to do that 😋', 
              'status':401})
 }

为了更好地解释我在做什么...我的index.js文件中有我所有的路由,我想使用get请求调用一个路由,该请求将(如果用户已登录)调用一个方法,该方法将查询数据库以搜索该用户已发布的所有帖子。url是固定的,我不会在数据库查询中使用它。我为查询获取req上的用户id的值。
如果我在url上传递id并使用它查询数据库,错误就消失了,但数据库总是返回null。
当我收到所有帖子(使用另一个路由)时,我得到以下响应:

"response": [
        {
        "text": [
            "We still need to update this"
        ],
        "tags": [],
        "images": [],
        "_id": "5d4c1c0266afb7629c2513b9",
        "title": "Second Post",
        "description": "This is the second post for our platform",
        "author": "5d4923257b914233b834a7fb",
        "created": "2019-08-08T12:56:34.720Z",
        "slug": "second-post",
        "id": "5d4c1c0266afb7629c2513b9"
      }

重点是作者id:5d4923257 b 914233 b834 a7 fb
如果我将端点更改为使用url中的id

router.get('/posts/:id', authController.isLoggedIn, catchErrors(blogController.myPosts))

const posts = await Post.find({author: {$eq: req.params.id}})

响应为null,错误消失,但mongo返回null。

92vpleto

92vpleto1#

错误在于您传递的是一个字符串,在本例中是me,而不是MongoDB ObjectID。
我想这条路线不起作用而其他路线起作用的原因是其他路线是这样的:/posts/:post_id。在此/posts/me路由中,您的代码假定me是post ID,并尝试查找ObjectID为me的post,这显然会崩溃。
如果你粘贴index.js的内容,我就能找出问题所在。
至于在使用来自request参数的id时没有得到结果,请去掉eq操作数,并使用用户id调用route

await Post.find({ author: req.params.id })
vlju58qv

vlju58qv2#

尽管这可能很奇怪,但改变请求的类型解决了问题。

router.post('/posts/me', authController.isLoggedIn, catchErrors(blogController.myPosts))

即使在请求中不发送任何类型的数据,一切都像在函数中声明的那样工作。
老实说,我不明白为什么,但这解决了我的问题,我会坚持下去。

xurqigkl

xurqigkl3#

这个问题也可以通过改变路由器的顺序来解决。如果你之前有这个路由,那么在url '/posts/:id'中的类似这样的东西,然后可能'/posts/my'将不再与有id的路由匹配。

相关问题