javascript - 将变量从 Node/Express 传递到 AngularJS

标签 javascript angularjs node.js passport.js

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

这是我的身份验证路由代码。我应该为此使用 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;
}

最佳答案

简短回答:是的,当您使用 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 对象,而是选择您实际想要显示的属性。

关于javascript - 将变量从 Node/Express 传递到 AngularJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032858/

相关文章:

javascript - 如何将附加参数传递给 jQuery DataTable ajax 调用?

php - 如何通过函数longArrayToString在php和nodejs之间获得相同的字符串

node.js - 如何使用带有可选参数的 Mongoosejs 'find' 函数?

javascript - Webpack 在目标 Node 时忽略代码拆分

javascript - Nightwatch js如何断言多个元素

php - jQuery 解析 Twitter jSON 但不解析我的同一个 PHP 文档

javascript - TypeScript 和 Socket.io

AngularJS - 即使从 Web API 返回错误响应,$http 错误回调也不起作用

javascript - AngularJS: View 已正确更新,但模型未正确更新

javascript - AngularJS Controller 中的 OneSignal 推送通知句柄