CastError:模型“Page”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败

Posted

技术标签:

【中文标题】CastError:模型“Page”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败【英文标题】:CastError: Cast to ObjectId failed for value "5be86bf8170c2c22f8bb93a6 " at path "_id" for model "Page" 【发布时间】:2019-04-17 16:16:57 【问题描述】:

我正在使用 node/express/mongo/mongoose 构建一个应用程序。我遇到了一个我似乎无法弄清楚的错误,并且谷歌搜索到目前为止没有任何帮助。

我尝试创建编辑页面,但遇到了错误。

Package.json


  "name": "cmscart",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1"
  ,
  "author": "",
  "license": "ISC",
  "dependencies": 
    "body-parser": "^1.18.3",
    "connect-flash": "^0.1.1",
    "ejs": "^2.6.1",
    "express": "^4.16.4",
    "express-messages": "^1.0.1",
    "express-session": "^1.15.6",
    "express-validator": "^5.3.0",
    "mongoose": "^5.3.10"
  

edit_page.ejs

<%- include('../_layouts/adminheader')  %>

    <h2 class="page-title">Edit a Page</h2>
    <a href="/admin/pages" class="btn btn-primary">Back to all Pages</a>
    <br>
    <br>

    <form method="post" action="/admin/pages/edit-page/<%= slug %> ">
        <div class="form-group">
            <label for="">Title</label>
            <input type="text" name="title" value="<%= title %>" class="form-control" placeholder="Title">

        </div>

        <div class="form-group">
            <label for="">Slug</label>
            <input type="text" name="slug" value="<%= slug %>" class="form-control" placeholder="Slug">

        </div>
        <div class="form-group">
            <label for="">Content</label>
            <textarea name="content" class="form-control" placeholder="Content" rows="10" cols="30"><%= content %></textarea>

        </div>

        <input type="hidden" name="id" value="<%= id %> ">
        <button class="btn btn-default">Submit</button>
    </form>


<%- include('../_layouts/adminfooter')  %>

admin_pages.js

/* GET edit page*/

/*  here after edit page "/:slug" because we didn't have a fixed value of url*/
router.get('/edit-page/:slug', function (req, res) 

    Page.findOne( slug: req.params.slug , function (err, page) 

        if (err) return console.log(err);

        res.render('admin/edit_page', 
            title: page.title,
            slug: page.slug,
            content: page.content,
            id: page._id
        );
    );


);




/* POST edit page*/



router.post('/edit-page/:slug', function (req, res) 
    req.checkBody('title', 'Title must have a value').notEmpty();
    req.checkBody('content', 'Content must have a value').notEmpty();

    var title = req.body.title;
    var slug = req.body.slug.replace(/\s+/g, '-').toLowerCase();
    if (slug == "") slug = title.replace(/\s+/g, '-').toLowerCase();

    var content = req.body.content;
    var id = req.body.id;


    var errors = req.validationErrors();
    if (errors) 
        res.render('admin/edit_page', 
            errors: errors,
            title: title,
            slug: slug,
            content: content,
            id: id
        );
     else 
        Page.findOne( slug: slug, _id:  '$ne': id  , function (err, page) 

            if (page) 
                req.flash('danger', 'Page slug exists , choose another.');
                res.render('admin/edit_page', 
                    title: title,
                    slug: slug,
                    content: content,
                    id:id
                );
            
            else 
                Page.findByIdAndUpdate(id, function (err, page) 
                    if (err) 
                        return console.log(err);
                    
                    page.title = title;
                    page.slug = slug;
                    page.content = content;


                    page.save(function (err) 
                        if (err)
                            return console.log(err);
                        req.flash('success', 'Page added!');
                        res.redirect('/admin/pages');

                    );
                );
            
        );
    


);

在这我遇到了这个错误

在新的 CastError (D:\projects\cmscart\node_modules\mongoose\lib\error\cast.js:29:11) 在 ObjectId.cast (D:\projects\cmscart\node_modules\mongoose\lib\schema\objectid.js:156:13) 在 ObjectId.SchemaType.applySetters (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:763:12) 在 ObjectId.SchemaType._castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1166:15) 在 ObjectId.SchemaType.castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1156:15) 在 ObjectId.SchemaType.castForQueryWrapper (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1135:15) 在演员表(D:\projects\cmscart\node_modules\mongoose\lib\cast.js:306:32) 在 model.Query.Query.cast (D:\projects\cmscart\node_modules\mongoose\lib\query.js:4024:12) 在 model.Query.Query._castConditions (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1690:10) 在 model.Query.Query._findOne (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1926:8) 在 process.nextTick (D:\projects\cmscart\node_modules\kareem\index.js:369:33) 在 _combinedTickCallback (内部/进程/next_tick.js:132:7) 在 process._tickCallback (internal/process/next_tick.js:181:9) 消息:“模型“页面”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败, 名称:'CastError', 字符串值:'"5be86bf8170c2c22f8bb93a6"', 种类:'ObjectId', 值:'5be86bf8170c2c22f8bb93a6', 路径:'_id', 原因:未定义, 模型: [功能:模型] 钩子:卡里姆 _pres:[对象],_posts:[对象], 根据: 猫鼬 连接:[数组], 模型:[对象], modelSchemas:[对象], 选项:[对象], _pluralize:[功能:复数], 插件:[数组], 模型名称:'页面', 模型:[功能:模型], D b: 本机连接 基础:[对象], 集合:[对象], 模型:[对象], 配置:[对象], 副本:假, 选项:空, 其他数据库:[], 相关数据库:, 状态:[对象], _readyState: 1, _closeCalled:假, _hasOpened:是的, '$internalEmitter': [对象], _听:假, _connectionOptions:[对象], 名称:'cmscart', 主机:'本地主机', 端口:27017, 用户:空, 通过:空, 客户:[对象], '$initialConnection': [对象], _events:[对象], _eventsCount:1, 分贝:[对象], 鉴别器:未定义, '$appliedMethods':真, '$appliedHooks':是的, 架构: 架构 对象:[对象], 路径:[对象], 别名:, 子路径:, 虚拟:[对象], 单嵌套路径:, 嵌套:, 继承:, 呼叫队列:[], _indexes:[], 方法: , 方法选项:, 静态:, 树:[对象], 询问: , childSchemas:[], 插件:[数组], '$id': 1, s:[对象], _userProvidedOptions:, 选项:[对象], '$globalPluginsApplied': true , 收藏: NativeCollection 集合:[对象], 选择:[对象], 名称:'页面', collectionName: '页面', 连接:[对象], 队列: [], 缓冲区:假, 发射器:[对象] , 查询: [Function] base: [Object] , '$__insertMany': [函数], '$init': 承诺 [Circular] , '$caught': 真 CastError:模型“页面”的路径“_id”中值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败 在新的 CastError (D:\projects\cmscart\node_modules\mongoose\lib\error\cast.js:29:11) 在 ObjectId.cast (D:\projects\cmscart\node_modules\mongoose\lib\schema\objectid.js:156:13) 在 ObjectId.SchemaType.applySetters (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:763:12) 在 ObjectId.SchemaType._castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1166:15) 在 ObjectId.SchemaType.castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1156:15) 在 ObjectId.SchemaType.castForQueryWrapper (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1135:15) 在演员表(D:\projects\cmscart\node_modules\mongoose\lib\cast.js:306:32) 在 model.Query.Query.cast (D:\projects\cmscart\node_modules\mongoose\lib\query.js:4024:12) 在 model.Query.Query._castConditions (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1690:10) 在 model.Query.Query._findOne (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1926:8) 在 process.nextTick (D:\projects\cmscart\node_modules\kareem\index.js:369:33) 在 _combinedTickCallback (内部/进程/next_tick.js:132:7) 在 process._tickCallback (internal/process/next_tick.js:181:9) 消息:“模型“页面”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败, 名称:'CastError', 字符串值:'"5be86bf8170c2c22f8bb93a6"', 种类:'ObjectId', 值:'5be86bf8170c2c22f8bb93a6', 路径:'_id', 原因:未定义, 模型: [功能:模型] 钩子:卡里姆 _pres:[对象],_posts:[对象], 根据: 猫鼬 连接:[数组], 模型:[对象], modelSchemas:[对象], 选项:[对象], _pluralize:[功能:复数], 插件:[数组], 模型名称:'页面', 模型:[功能:模型], D b: 本机连接 基础:[对象], 集合:[对象], 模型:[对象], 配置:[对象], 副本:假, 选项:空, 其他数据库:[], 相关数据库:, 状态:[对象], _readyState: 1, _closeCalled:假, _hasOpened:是的, '$internalEmitter': [对象], _听:假, _connectionOptions:[对象], 名称:'cmscart', 主机:'本地主机', 端口:27017, 用户:空, 通过:空, 客户:[对象], '$initialConnection': [对象], _events:[对象], _eventsCount:1, 分贝:[对象], 鉴别器:未定义, '$appliedMethods':真, '$appliedHooks':是的, 架构: 架构 对象:[对象], 路径:[对象], 别名:, 子路径:, 虚拟:[对象], 单嵌套路径:, 嵌套:, 继承:, 呼叫队列:[], _indexes:[], 方法: , 方法选项:, 静态:, 树:[对象], 询问: , childSchemas:[], 插件:[数组], '$id': 1, s:[对象], _userProvidedOptions:, 选项:[对象], '$globalPluginsApplied': true, _requiredpaths: [数组] , 收藏: NativeCollection 集合:[对象], 选择:[对象], 名称:'页面', collectionName: '页面', 连接:[对象], 队列: [], 缓冲区:假, 发射器:[对象] , 查询: [Function] base: [Object] , '$__insertMany': [函数], '$init': 承诺 [Circular] , '$caught': 真 CastError:模型“页面”的路径“_id”中值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败 在新的 CastError (D:\projects\cmscart\node_modules\mongoose\lib\error\cast.js:29:11) 在 ObjectId.cast (D:\projects\cmscart\node_modules\mongoose\lib\schema\objectid.js:156:13) 在 ObjectId.SchemaType.applySetters (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:763:12) 在 ObjectId.SchemaType._castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1166:15) 在 ObjectId.SchemaType.castForQuery (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1156:15) 在 ObjectId.SchemaType.castForQueryWrapper (D:\projects\cmscart\node_modules\mongoose\lib\schematype.js:1135:15) 在演员表(D:\projects\cmscart\node_modules\mongoose\lib\cast.js:306:32) 在 model.Query.Query.cast (D:\projects\cmscart\node_modules\mongoose\lib\query.js:4024:12) 在 model.Query.Query._castConditions (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1690:10) 在 model.Query.Query._findOne (D:\projects\cmscart\node_modules\mongoose\lib\query.js:1926:8) 在 process.nextTick (D:\projects\cmscart\node_modules\kareem\index.js:369:33) 在 _combinedTickCallback (内部/进程/next_tick.js:132:7) 在 process._tickCallback (internal/process/next_tick.js:181:9) 消息:“模型“页面”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败, 名称:'CastError', 字符串值:'"5be86bf8170c2c22f8bb93a6"', 种类:'ObjectId', 值:'5be86bf8170c2c22f8bb93a6', 路径:'_id', 原因:未定义, 模型: [功能:模型] 钩子:卡里姆 _pres:[对象],_posts:[对象], 根据: 猫鼬 连接:[数组], 模型:[对象], modelSchemas:[对象], 选项:[对象], _pluralize:[功能:复数], 插件:[数组], 模型名称:'页面', 模型:[功能:模型], D b: 本机连接 基础:[对象], 集合:[对象], 模型:[对象], 配置:[对象], 副本:假, 选项:空, 其他数据库:[], 相关数据库:, 状态:[对象], _readyState: 1, _closeCalled:假, _hasOpened:是的, '$internalEmitter': [对象], _听:假, _connectionOptions:[对象], 名称:'cmscart', 主机:'本地主机', 端口:27017, 用户:空, 通过:空, 客户:[对象], '$initialConnection': [对象], _events:[对象], _eventsCount:1, 分贝:[对象], 鉴别器:未定义, '$appliedMethods':真, '$appliedHooks':是的, 架构: 架构 对象:[对象], 路径:[对象], 别名:, 子路径:, 虚拟:[对象], 单嵌套路径:, 嵌套:, 继承:, 呼叫队列:[], _indexes:[], 方法: , 方法选项:, 静态:, 树:[对象], 询问: , childSchemas:[], 插件:[数组], '$id': 1, s:[对象], _userProvidedOptions:, 选项:[对象], '$globalPluginsApplied': true, _requiredpaths: [数组] , 收藏: NativeCollection 集合:[对象], 选择:[对象], 名称:'页面', collectionName: '页面', 连接:[对象], 队列: [], 缓冲区:假, 发射器:[对象] , 查询: [Function] base: [Object] , '$__insertMany': [函数], '$init': 承诺 [Circular] , '$caught': 真

【问题讨论】:

【参考方案1】:

"5be86bf8170c2c22f8bb93a6 " 的末尾有一个空格字符。你先试试修剪吗?

在文件 D:\projects\cmscart\node_modules\kareem\index.js 第 369 行使用 id.trim() 代替 id 以及您正在使用的任何地方,或者您可以先更正开头的 id

【讨论】:

我如何修剪这个

以上是关于CastError:模型“Page”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章

CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败

Mongoose:CastError:对于模型“”的路径“_id”处的值“”,转换为 ObjectId 失败