【问题标题】:Make require()'d variables common across node routers使 require() 的变量在节点路由器之间通用
【发布时间】:2020-09-30 14:22:07
【问题描述】:

在 node 应用的开头使用 require() 是很常见的:

const fs = require('fs');
const request = require('request');
const path = require('path');

此外,使用路由器在多个文件之间拆分快速路由是一个好习惯:

app.use("/admin", require("./admin"));
app.use("/questions", require("./questions"));

但是这些路由器文件可能需要与主 app.js 文件中使用的相同的要求,并且必须为每个文件重复它们。有没有办法将这些需求放在一个文件中并在路由器和主 app.js 文件之间共享它们?

我测试了导入,但它无法分配给全局范围。我测试了 eval,只要我使用 'var' 而不是 'const',它就可以工作,但是,正如每个人所说,“如果你使用 eval,应该有一种更安全/更有效的方法可以不用它”。

【问题讨论】:

  • 也许你可以有一个通用文件并在那里导入所有通用模块然后你只能在你的路线中导入该文件
  • 你说......导入到一个对象,而不是全局范围?然后,我将不得不使用 obj.fs()、obj.app()、obj.request()。我认为这会使所有代码变得混乱。如果没有其他办法,也许这就是答案。
  • 是的,这就是我们迄今为止一直在做的事情。所有常见的辅助函数都在一个文件中。另外,我不知道 express 但是在 Koa 中你可以自动导入路由,这样你就不会每次都导入路由了。
  • 模块的一个重点是制作可重用和独立可测试的代码,而不依赖于某些未指定的全局环境。因此,为了利用这一点,每个模块都应该 require()import 自己的依赖项。只需习惯于将模块需要的任何内容放在模块顶部,即使您可能觉得自己在重复自己。这是良好模块化的要求。只是习惯这样做。不要去寻找一种方法来破坏模块的一些优点以节省一点打字。

标签: node.js express node-modules


【解决方案1】:

分配给全局范围是通过 global 对象完成的:

//app.js:
const mylib = require("./mylib");
for (var m in mylib) global[m] = mylib[m]; //every member of the object becomes global


//mylib.js:
const fs = require("fs");
const {exec} = require('child_process');

module.exports = {
    fs,
    exec,
    
    copyFile(srcPath, dstPath) {
        fs.copyFile(srcPath, dstPath, err => {
            if (err) console.log(err);
        });
    },
    
    deleteFile(fullPath) {
        fs.unlink(fullPath, err => {
            if (err) console.log(err);
        });
    },
};

这样,感觉就像您将 module.exports 中的代码粘贴到每个依赖的 .js 文件中,管理文件 mylib.js 中的依赖关系。

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多