Javascript 将变量从Node/Express传递到AngularJS
我想知道如何将变量从Node/Express传递到AngularJS前端。特别是,如果我使用Express(Passport)进行身份验证,我如何传递用户名和信息以显示在我的应用程序的一角,以及“注销”按钮旁边 这是我的身份验证路由代码。我应该为此使用URL变量吗?或者我应该设法实现一个单独的端点来传递这一点点信息吗 只是澄清一下,一旦用户登录并被定向到“/”AngularJS,前端将接管并在其内部进行路由Javascript 将变量从Node/Express传递到AngularJS,javascript,angularjs,node.js,passport.js,Javascript,Angularjs,Node.js,Passport.js,我想知道如何将变量从Node/Express传递到AngularJS前端。特别是,如果我使用Express(Passport)进行身份验证,我如何传递用户名和信息以显示在我的应用程序的一角,以及“注销”按钮旁边 这是我的身份验证路由代码。我应该为此使用URL变量吗?或者我应该设法实现一个单独的端点来传递这一点点信息吗 只是澄清一下,一旦用户登录并被定向到“/”AngularJS,前端将接管并在其内部进行路由 var express = require('express'); var router
var express = require('express');
var router = express.Router();
module.exports = function(passport){
var isAuthenticated = function (req, res, next) {
// if user is authenticated in the session, call the next() to call the next request handler
// Passport adds this method to request object. A middleware is allowed to add properties to
// request and response objects
if (req.isAuthenticated()){
//console.log(next());
return next();
}
// if the user is not authenticated then redirect him to the login page
res.redirect('/login');
}
/* GET login page. */
router.get('/login', function(req, res) {
// Display the Login page with any flash message, if any
res.render('login', { message: req.flash('message') });
});
/* Handle Login POST */
router.post('/login', passport.authenticate('login', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash : true
}));
/* GET Registration Page */
router.get('/signup', function(req, res){
res.render('register',{message: req.flash('message')});
});
/* Handle Registration POST */
router.post('/signup', passport.authenticate('signup', {
successRedirect: '/',
failureRedirect: '/signup',
failureFlash : true
}));
/* GET Home Page when logged in */
router.get('/', isAuthenticated, function(req, res){
res.render('index', { user: req.user });
});
/* Handle Logout */
router.get('/signout', function(req, res) {
req.logout();
res.redirect('/login');
});
return router;
}
我认为最佳实践是实现一个api,该api返回ajax请求所需的所有数据。
但是,如果您不想完成所有这些工作,您可以在页面中添加一个隐藏的输入元素,并使用json字符串设置其值,稍后可以将其解析为客户端的js对象。对于passport,我非常确定用户信息在请求对象中 也就是说,您应该能够通过req.user.name等进行访问
然后,您可以在需要时将其发送给angular,以响应“res.send({currentUser:req.user})”,或者可能在您的登录名中发送,并将其存储在rootscope或localStorage/cookie中。简短回答:是,当您使用Express时,您应该创建一个单独的端点以从angular应用程序检索用户数据 另一个答案已经指出,此用户数据应存储在
req.user
中
因此,您的终点可以如下所示:
var express = require('express');
var isAuthenticated = require('path/to/exported/middleware').isAuthenticated;
var router = express.Router();
router.get('/user', isAuthenticated, function(req, res) {
var data = {
name: req.user.name,
email: req.user.email,
/* ... */
};
res.send({
data: data
});
});
module.exports = router;
不要发送整个
req.user
对象,而是选择实际要显示的属性 我需要保护这个终点吗?也就是说,如果有人直接导航到它怎么办?导航到它的每个人都只会收到他/她的用户信息。使用用户的会话数据为每个请求填充req.user
对象,因此无法通过这种方式访问其他用户的用户数据。我明白了。但是,如果用户未登录,它仍然保持受保护状态。如果用户未登录req。user
将为空。为了避免这种情况,您可以添加您的isAuthenticated
中间件,我将更新我的答案。明白了。我刚试过。它似乎起作用了。顺便问一下,您知道是否可以自定义passport用于身份验证的字段?也就是说,我是否可以删除用户名而只使用电子邮件?这种方法很容易导致问题。用户可以更改DOM中输入的值(通过DevTools),然后当js脚本执行时,它将清除被劫持的数据。