【问题标题】:Passing Variables from Node / Express to AngularJS将变量从 Node / Express 传递到 AngularJS
【发布时间】:2016-10-28 05:19:44
【问题描述】:

我想知道如何将变量从 Node / Express 传递到我的 AngularJS 前端。特别是,如果我使用 Express (Passport) 进行身份验证,如何传递用户名和信息以显示在我的应用角落的“注销”按钮旁边?

这是我的身份验证路由代码。我应该为此使用 URL 变量吗?还是我应该尝试以某种方式实现一个单独的端点来传递这一点信息?

澄清一下,一旦用户登录并被定向到“/”,AngularJS 前端就会接管并在其内部进行路由。

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;
}

【问题讨论】:

    标签: javascript angularjs node.js passport.js


    【解决方案1】:

    我认为最好的做法是实现一个 api,它通过 ajax 请求返回您需要的所有数据。 但是如果你不想做所有这些工作,你可以在你的页面中添加一个隐藏的输入元素,并用一个 json 字符串设置他的值,以后可以在你的客户端解析为 js 一个对象。

    【讨论】:

    • 这种方法很容易引起问题。用户可以更改 DOM 中输入的值(通过 DevTools),然后当 js 脚本执行时,它将清除劫持的数据。
    【解决方案2】:

    我很确定护照,用户信息在请求对象中。

    意思是应该可以通过 req.user.name 等访问。

    然后,您可以在需要时将其发送到 Angular 以响应“ res.send({currentUser: req.user})”,或者可能在您的登录名中并将其存储在 rootscope 或 localStorage / cookie 中

    【讨论】:

      【解决方案3】:

      简短回答:是的,当您使用 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 中间件,我会更新我的答案。
      • 知道了。我刚试了一下。它似乎工作。顺便问一下,您知道是否可以自定义护照用于身份验证的字段?也就是说,我可以删除用户名并坚持使用电子邮件吗?
      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2015-08-18
      • 2020-09-21
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多