Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量从Node/Express传递到AngularJS_Javascript_Angularjs_Node.js_Passport.js - Fatal编程技术网

Javascript 将变量从Node/Express传递到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

我想知道如何将变量从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;
}

我认为最佳实践是实现一个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脚本执行时,它将清除被劫持的数据。