将全局变量传递给 Node.js 中的另一个控制器文件

Passing global variable to another controller file in Node.js

我创建了一个全局变量 (userEmail) 来保存当前用户的值。 Post 请求处理授权并将当前用户的电子邮件分配给该全局变量。将该全局变量 (userEmail) 导出到另一个文件时出现问题。另一个文件将其读取为 'not assigned',可能是因为 module.export 在 route.post 之前运行。通过对当前用户的 route.post 赋值更改另一个文件中的全局变量的解决方案是什么?

var userEmail = 'not assigned';


route.get('/', (req, res) => {
    res.render('signIn');
})

route.post('/', (req, res) => {
    let email = req.body["sign-in-email"];
    let password = req.body["sign-in-password"];

    let errorMessage = '';

    userModel.findOne({ 'email': email }, 'email password balance', function (err, user) {
        if (err) return handleError(err);
        if (email == user.email) {
            if (bcrypt.compareSync(password, user.password)) {   // function returns true if password matched the database hashed password
                userEmail = user.email;
                exports = {userEmail};
                res.render('dashboard', { email: userEmail , balance: user.balance})
                console.log(userEmail)
            } else {
                errorMessage = 'Invalid password'
                res.render('home', { errorMessage: errorMessage });
            };
        } else {
            errorMessage = 'User Not Found'
            res.render('home', { errorMessage: errorMessage });
        }
    });
})

    module.exports = {route, userEmail};

NodeJS 有一个 global 变量,您可以使用它来管理全局值。这是全局变量的示例, 如果你有一个记录器 class 并且你想在你的环境中全局拥有它的实例,你可以这样做,

    global.logger = new Logger()

I have created a global variable (userEmail) which holds the value of current user.

这是你的第一个问题。没有“当前用户”这样的东西。可以有多个用户都在向您的 http 服务器发出请求,并且他们的请求正在处理中。

您不能在全局变量中保留 request-specific 状态或 user-specific 状态。要么将该信息状态添加到请求的 req 对象,以便处理请求的其他部分都可以从那里访问它(这就是中间件所做的),将它添加到绑定到的 user-session特定用户,并可从该用户的任何请求访问,或将该状态传递给在处理特定请求的响应时可能需要它的任何函数。

您不能将 user-specific 状态放入全局变量中。来自不同用户的多个请求将覆盖全局,并且状态将在来自不同用户的请求之间混淆。


另外,这个结构:

module.exports = {route, userEmail};

在模块初始化时导出 userEmail 的当前值(在您的代码中为 'not assigned')。随着 userEmail 变量值的变化,导出永远不会改变。因此,除了这不是 request-specific 变量的正确结构这一事实(如上所​​述)之外,您也不能导出类​​似这样的内容。


在您的特定情况下,您似乎希望 userEmail 值可用于该用户未来的请求。有几种方法可以做到这一点,但我建议使用 express-session 并将 userEmail 添加到该用户的会话对象。然后该会话对象将绑定到来自该特定用户的请求(通过存储在 cookie 中的 sessionID),并且用户会话对象中的数据将可用于该用户的所有未来请求(在会话 cookie 的配置时间限制内) ).