为什么在使用 sails-auth 验证后 "req.user" 在 /user/me 控制器中总是空的?

Why "req.user" always empty in the /user/me controller after validation with sails-auth?

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

文档说:

Authenticate with the local strategy via a POST to /auth/local with params identifier (email) and password). This will also create a session. See passport.local for more.

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

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

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

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

您所写的 me 操作只会 return 无论您作为用户参数传入什么。 Sails 建立在 Express.js 之上,因此 req 是来自浏览器的请求,而 res 是对浏览器的响应。

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

为了调试和大致了解 reqres 对象的结构,我建议您始终使用 [=23= 开始航行(在开发中,从不在生产中) ]旗帜。
sails lift --verbose

那么你可以这样做:

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();
    },

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