CastError:在路径“_id”处为值“users.client.module.js”转换为 ObjectId 失败

Posted

技术标签:

【中文标题】CastError:在路径“_id”处为值“users.client.module.js”转换为 ObjectId 失败【英文标题】:CastError: Cast to ObjectId failed for value "users.client.module.js" at path "_id" 【发布时间】:2016-05-06 14:47:00 【问题描述】:

这又是我在阅读 MEAN 堆栈开发书籍时遇到的另一个错误。我们刚刚添加了一个新的用户模块和一个用户服务,允许 Angular 使用来自经过身份验证的用户的用户信息。我在终端中收到以下文件的 500 错误

'/users/users.client.module.js'

这是与之相关的服务文件。根据我的阅读,这是一个 Mongoose 错误。为什么会弹出这个?我什至还没有对用户进行身份验证,这发生在索引页面加载时。

索引控制器

exports.render = function(req,res) 

res.render('index', 
    title: 'Hello World',
    user: JSON.stringify(req.user)
);

;

索引.ejs

<!DOCTYPE html>

<html xmlns:ng="http://angularjs.org">
<head>
    <title><%= title%></title>
</head>
<body>
    <% if (user)  %>
        <a href='/signout'>Sign Out</a>
    <%  else  %>
            <a href='/signup'>Sign-up</a>
            <a href='/signin'>Sign-in</a>
    <%  %>

    <h1><%= title%></h1>

    <section ng-view></section>

    <script type="text/javascript">
        window.user = <%- user || 'null' %>
    </script>

    <script type="text/javascript" src="/lib/angular/angular.js"></script>
    <script type="text/javascript" src="/lib/angular-route/angular-route.js"></script>
    <script type="text/javascript" src="/users/users.client.module.js"></script>
    <script type="text/javascript" src="/users/services/authentication.client.service.js"></script>
    <script type="text/javascript" src="/application.js"></script>
    <script type="text/javascript" src="/example/example.client.module.js"></script>
    <script type="text/javascript" src="/example/controllers/example.client.controller.js"></script>
    <script type="text/javascript" src="/example/config/example.client.routes.js"></script>

</body>

用户模块

angular.module('users',[]);

用户认证服务

angular.module('users').factory('Authentication', [
function()
    this.user = window.user;

    return 
        user: this.user
    ;

]);

编辑 - 2/2/2016 将视图中的脚本标签重新排序为此顺序,但仍然不行。

    <script type="text/javascript" src="/lib/angular/angular.js"></script>
    <script type="text/javascript" src="/lib/angular-route/angular-route.js"></script>


    <script type="text/javascript" src="/example/example.client.module.js"></script>
    <script type="text/javascript" src="/example/controllers/example.client.controller.js"></script>
    <script type="text/javascript" src="/example/config/example.client.routes.js"></script>

    <script type="text/javascript" src="/users/users.client.module.js"></script>
    <script type="text/javascript" src="/users/services/authentication.client.service.js"></script>

    <script type="text/javascript" src="/application.js"></script>

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,但我是从pm2 运行的。关闭pm2 并手动执行node server.js 后,它工作正常。不知道为什么……

【讨论】:

【参考方案2】:

本书的源代码导致使用users.client.module.js模块时出错。在我的分析中,加载在 index.ejs 中的静态文件 /users/users.client.module.js 似乎被解释为服务器路由 /users/:userId 导致在 MongoDB 中搜索 ID 为 user.client.module 的用户。 js。该问题已通过将 app.use(express.static('./public') 语句放置在 express.js 配置文件中的 setup 开头(例如,在语句 var app = express(); 之后)解决,但确保在 de require routes 语句之前。

注意:作者在book's github repo 中添加了这一行(就在关闭之前,“return app”):

【讨论】:

就是这样!谢谢。不幸的是,他没有提到这条线需要在路线之前移动。不过,我仍然感兴趣的一件事是为什么输入框现在在以经过身份验证的用户身份登录后消失了。但我敢肯定这是一个简单的解决办法。【参考方案3】:

重新定位

app.use(express.static('./public'));

对我不起作用。但只需重命名public/users 目录即可。 (谢谢 Bsord@disqus)

【讨论】:

【参考方案4】:

如果您评论 users.server.routes.js 这段代码,遇到同样的问题并已解决:

app.route('/users')
    .post(users.create)
    .get(users.list);

app.route('/users/:userId')
    .get(users.read)
    .put(users.update)
    .delete(users.delete);

app.param('userId', users.userByID);

【讨论】:

谢谢!奇怪,我在书中没有看到任何地方提到过。究竟发生了什么?为什么我们要删除这些行?这对服务器端 REST api 来说不是很重要吗? 实际上,我不得不撤销它作为答案。看起来通过删除这些行,它允许应用程序运行并允许用户登录,但是 Angular 现在无法从服务器访问用户,因此当您登录时,视图不再显示输入框。 您好 Andrew,我尝试了您的代码,可能与您在 index.ejs 上引用脚本的顺序有关。你能试着做和书一样的顺序吗? 嘿,格兰,我也尝试过,但没有运气。我将顺序更改如下,但仍然出现 500 错误:角度、角度路由、example.client.module、example.client.controller、users.client.module、authentication.client.server angular.js,angular-route.js,example.client.module.js,example.client.controller.js,example.client.routes.js,users.client.module.js, authentication.client.service.js, application.js.

以上是关于CastError:在路径“_id”处为值“users.client.module.js”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:CastError:在路径“items”处为值“ value:'x'”转换为嵌入失败

mongoose CastError:在路径“apps”处为值“[object Object]”转换为未定义失败

mongoose.js CastError:在路径“未定义”处为值“[object Object]”转换为数字失败

CastError:在路径“_id”处转换为 ObjectId 失败

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

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