2016-07-05 83 views
2

我目前正在开始使用Sails.js,并且我想将用户帐户添加到我的玩具应用程序,因此我安装了创建基于Passport的用户认证系统的“sails-auth”软件包。我可以通过发送POST /user来创建新用户,我可以用POST /auth/local登录。为什么在用sails-auth进行验证之后,/ user/me控制器中的“req.user”总是空的?

文档说:

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

但是,当我尝试GET /user/me时,应该返回会话中当前用户的控制器操作的路由,页面会给出空的响应。这是为什么发生?是否有某种配置步骤,我错过了?

顺便说一句,我没有改变或搞砸了sails-auth软件包。它仍然是全新的;在“我”的动作看起来是这样的:

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

编辑:我已经在帆-AUTH回购搜索问题找到了一个临时的解决方法。您可以从req.session.passport.user获取字符串用户标识,而不是从req.user获取用户对象。

回答

2

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

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

调试和只是一般越来越为reqres对象的结构如何,我建议你总是开始帆(开发中,从来没有生产)的感觉与verbose标志。
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(); 
    }, 

只需粘贴在你的路线模块的开始。

+0

谢谢,但我相信“用户”对象不是一个参数(从源头搜索)。这是通过AuthController中的回调设置的,当它使用Passport.js时(参见图片http://i.imgur.com/WySYqRW.png)。 此外,如何编辑“我”操作的源代码?它是npm模块的一部分。当我上次尝试编辑它(添加日志记录)时,日志消息没有显示。 –

+0

@EricZhang嗯,也许我没有正确理解你的问题,所以你没有写'我'功能?但是你的路由表中有一条路由指向它? – Ryan

+0

是的,我没有写'me'函数。该路线仅来自蓝图操作(UserController/me)。我认为,如果我要关闭它们,那么我将不得不通过“我”功能。对不起,如果它不明确! –

相关问题