【问题标题】:Why "req.user" always empty in the /user/me controller after validation with sails-auth?为什么“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?
【发布时间】:2016-11-07 22:27:34
【问题描述】:

我目前正在开始使用 Sails.js,并且我想将用户帐户添加到我的玩具应用程序中,因此我安装了创建基于 Passport 的用户身份验证系统的“sails-auth”包。我可以通过发送POST /user 创建新用户,我可以使用POST /auth/local 登录。

文档说:

通过带有参数标识符(电子邮件)和密码的 POST 到 /auth/local 使用本地策略进行身份验证。这也将创建一个会话。有关更多信息,请参见 passport.local。

但是,当我尝试 GET /user/me 时,它会路由到一个控制器操作,该控制器操作应该在会话中返回当前用户,而页面却给出了一个空响应。为什么会这样?我是否缺少某种配置步骤?

顺便说一句,我没有更改或弄乱sails-auth 包。它仍然是全新的; “我”动作如下所示:

  me: function (req, res) {
    res.ok(req.user);
  }

编辑:我通过搜索sails-auth repo 中的问题找到了一个临时解决方法。您可以从req.session.passport.user 获取字符串用户ID,而不是从req.user 获取用户对象。

【问题讨论】:

    标签: javascript node.js sails.js passport.js


    【解决方案1】:

    您所写的me 操作只会返回您作为用户参数传入的任何内容。 Sails 建立在 Express.js 之上,因此 req 是来自浏览器的请求,res 是对浏览器的响应。

    您很可能将数据发送到req 正文中的me 操作,这就是您的响应为空的原因,简单地说,req.user 为空,因此响应为空。在这种情况下,您可以使用req.body.user 访问它,您也可以尝试var user = req.params();

    为了调试和大致了解reqres 对象的结构,我建议您始终使用verbose 标志开始航行(在开发中,从不在生产中)。
    @987654333 @

    那么你可以这样做:

    me: function(req, res){
       sails.log.verbose(req);
       res.ok(req.user);
    }
    

    让它打印出整个 req 对象,这样你就知道req.user 中有什么。

    虽然您通常会进行数据库查找,因为 user 参数将是一个 id。这意味着您的 me 函数可能看起来像(显然取决于您的 dbc,它可能会非常不同)如下:

    me: function(req, res){
        var userId = req.body.user;
        User.find({'user_id': userId}.exec(function(err, user){
            if(err){
                //tell peeps there was an error
            }else{
                res.ok(user);
            }
        });
    }
    

    路由和请求对象的最佳调试:

        '/*' : function(req, res, next) {
            sails.log.verbose("method: ", req.method, "\n body: ", req.body, "\n url:", req.url);
            next();
        },
    

    只需将其粘贴到路线模块的开头即可。

    【讨论】:

    • 谢谢,但我相信“用户”对象不是参数(通过在源中搜索)。它是由 AuthController 中的回调设置的,当它使用 Passport.js 时(参见图片i.imgur.com/WySYqRW.png)。此外,如何编辑“我”动作的源代码?它是 npm 模块的一部分。当我上次尝试编辑它(添加日志记录)时,日志消息没有显示出来。
    • @EricZhang 嗯,也许我没有正确理解你的问题,所以你没有写me 函数?但是您的路由表中有一条指向它的路由?
    • 是的,me 函数不是我写的。该路线仅来自蓝图操作(UserController/me)。我认为如果我要关闭它们,那么我将不得不路由到me 函数。抱歉,如果不清楚!
    • @EricZhang,我知道你从哪里来的想法 req.user 应该包含你的用户,但是来自客户端的每个req 都是它自己的对象并且有它自己的状态,所以调用进行身份验证,然后对/me单独 调用将生成两个不同的req 对象。
    • 如果您将最后一个代码坑粘贴到您的路线模块的开头,然后使用--verbose 标志抬起,您可以在终端中看到有关req 对象的各种信息。
    猜你喜欢
    • 2021-07-27
    • 2013-04-17
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2020-11-02
    • 2014-11-27
    • 2016-04-02
    相关资源
    最近更新 更多