【问题标题】:Access global variables from exported function从导出的函数访问全局变量
【发布时间】:2019-01-18 07:44:31
【问题描述】:

我有一个文件config.ts,它只是导出一个配置对象:

const config = {
    baseURL: <string> 'http://example.com',
};

export default config;

我有另一个名为 methods.ts 的文件,它导入配置对象并导出使用此配置对象的函数。

import config from './config';

export function someMethod() {
    let url = config.baseURL;
    ...
}

我在 express 路由器内部调用这个someMethod

import { someMethod } from '../methods';

router.get('/something', function(req, res, next) {
    let x = someMethod();
    ...
});

当这个someMethod 被调用时,config 变量是undefinedsomeMethod 似乎在稍后调用时无法从同一文件中看到导入的数据。这样做的正确方法是什么?

【问题讨论】:

    标签: node.js express typescript


    【解决方案1】:

    Node 将您的模块包装在一个名为 the module wrapper 的 IIFE 中,因此即使它在您的模块中是全局的,它实际上仍然是本地的。

    如果你想在你的模块之外访问config,你需要明确地导出它。

    function someMethod() {
        let url = config.baseURL;
        ...
    }
    export { someMethod, config };
    

    如果config 实际上是许多文件共有的,您可以使用Dependency Injection 并将config 移动到包含需要配置的路由器的文件中。

    someMethod 改为接受config

    // methods.ts
    function someMethod(config) {
      let url = config.baseURL;
      ... 
    }
    
    export { someMethod };
    

    在您的路由器中导入./config 并将config 传递给someMethod

    // router
    import config from './config'
    import { someMethod } from '../methods';
    
    router.get('/something', function(req, res, next) {
        let x = someMethod(config);
        ...
    });
    

    【讨论】:

    • 我希望 configsomeMethod 中可用。从该文件重新导出它没有任何意义......
    • @KingJulien 在我看来,解决这个问题的更好方法是从路由器注入配置
    • @KingJulien 更新了我的答案,包括基于我上次评论的示例
    • 是的,这是一条路……而且我认为它并不像我最初认为的那么糟糕……
    【解决方案2】:

    我相信你可以做到的

    import config from './config';
    var Config = config
    export function someMethod() { console.log(Config) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      相关资源
      最近更新 更多