【问题标题】:How to access global scope variables in callback functions? [JS]如何在回调函数中访问全局范围变量? [JS]
【发布时间】:2018-10-09 02:38:01
【问题描述】:

对于我的用户注册,我有

const express = require ('express');
const userRouter = express.Router ();

userRouter.get ('/', function getUserList (req, res) {
    let User = require ('../models').User;
    User.find ({}, function (err, list) {
        res.json (list);
    });
});

userRouter.post ('/', function createUser (req, res) {
    let User = require ('../models').User;
    if (req.body.username && req.body.password)
        User.create (req.body, function (err, user) {
            res.json (user);
        });
});

... 3 more functions with the same `let User` ...

module.exports = userRouter;

在这里,我必须require 模块模型两次。我尝试将用户变量设置为程序顶部的全局变量,例如

const express = ..., userRouter = ...
var User = ...

但是,在我的回调函数中仍然无法访问此用户变量。

多次需要用户模块是正确的方法还是我错过了什么?

edit:在回调函数内部,用户变量是未定义的。

【问题讨论】:

  • 没有理由在回调之外声明它不应该被访问。发生什么错误?
  • 我认为node有一个特殊的全局变量
  • 您能显示您的models 文件中的内容吗?
  • @Doug 本来打算发布的,但您首先提到了它,所以我认为您应该将其发布为答案。

标签: javascript express asynchronous scope callback


【解决方案1】:

正如@Doug 提到的,您应该像这样将global 传递给用户变量:

global.user = ...

这个过程实质上将user 变成了一个全局可访问的变量。您可以在此处阅读有关 Node 的 global 的更多信息,以了解它的作用以及它的含义:http://stackabuse.com/using-global-variables-in-node-js/

【讨论】:

  • 不,您不应该使用全局变量。一个模块级常量就足够了。
  • @Bergi 同意了。我提供的链接中也提到了这一点。但他们也展示了哪些情况可能需要使用全局变量。
  • 是的,我只是说这不是这些情况之一。
  • 这将使我的用户变量在所有模块中都可以访问,对吗?我不希望这样,我希望它可以在同一模块的回调中访问。这没有发生,因为回调说用户变量未定义。
【解决方案2】:

对于@charloetfl 的观点,如果它只是在文件中,则应该在回调之外或文件顶部声明它。如果我们谈论的是跨项目中所有模块和文件的访问,那么将其添加到全局对象是在节点中进行处理的方法,正如 @doug 和 @andrewl 提到的那样。

【讨论】:

  • 在外部声明用户会导致回调函数说用户变量未定义。
  • 由于在节点开发中也不建议使用 global,我建议查看在 app.locals 中创建 User 变量,以便可以通过 req.app.locals 在您的 req 对象中访问它,如所述在expressjs.com/en/api.html#app.locals。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多