为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?
Posted
技术标签:
【中文标题】为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?【英文标题】: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
获取用户对象。
【问题讨论】:
【参考方案1】:您所写的me
操作只会返回您作为用户参数传入的任何内容。 Sails 建立在 Express.js 之上,因此 req
是来自浏览器的请求,res
是对浏览器的响应。
您很可能将数据发送到req
正文中的me
操作,这就是您的响应为空的原因,简单地说,req.user
为空,因此响应为空。在这种情况下,您可以使用req.body.user
访问它,您也可以尝试var user = req.params();
为了调试和大致了解req
和res
对象的结构,我建议您始终使用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
对象的各种信息。
以上是关于为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?的主要内容,如果未能解决你的问题,请参考以下文章
在 React (ES6) 中访问 Passport 的 req.user? API 调用将 req.user 返回为未定义
使用 google-passport-oauth 登录后 req.user 未定义
Passport + NodeJs + Express 得到“req.user”未定义