Node.js 使require()和#x27;d节点路由器上的通用变量

Node.js 使require()和#x27;d节点路由器上的通用变量,node.js,express,node-modules,Node.js,Express,Node Modules,通常在节点应用程序的开头使用require(): const fs = require('fs'); const request = require('request'); const path = require('path'); 此外,使用路由器在多个文件之间分割快速路由也是一种良好做法: app.use("/admin", require("./admin")); app.use("/questions", require("./questions")); 但是这些路由器文件可能需要与

通常在节点应用程序的开头使用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,应该有一种更安全/有效的方法来使用它”。分配全局范围是通过全局对象完成的:

//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中的代码粘贴到每个dependent.js文件中,管理文件mylib.js中的依赖项。

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

//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中的代码粘贴到每个dependent.js文件中,管理mylib.js文件中的依赖项。

也许您可以拥有一个公共文件并在那里导入所有公共模块,然后您只能在整个流程中导入该文件。您可以说。。。导入到对象,而不是全局范围?然后,我必须使用obj.fs()、obj.app()、obj.request()。我想这会把所有的代码弄得乱七八糟。如果没有别的办法,也许这就是答案。是的,这就是我们目前所做的。所有常用辅助函数都在一个文件中。另外,我不知道Express,但是在Koa,您可以自动导入路由,这样,您就不会每次都输入路由。模块的一个主要点是使不依赖于某些未指定的全局环境的可重用和独立可测试代码。因此,为了利用这一点,每个模块都应该
require()
import
自己的依赖项。只要习惯于将模块需要的任何东西放在模块顶部,即使你可能觉得自己在重复。这是良好模块化的要求。习惯这样做就好了。不要想办法破坏模块的一些优点来节省一点输入。也许你可以有一个公共文件并在那里导入所有公共模块,那么你只能在整个过程中导入该文件你说。。。导入到对象,而不是全局范围?然后,我必须使用obj.fs()、obj.app()、obj.request()。我想这会把所有的代码弄得乱七八糟。如果没有别的办法,也许这就是答案。是的,这就是我们目前所做的。所有常用辅助函数都在一个文件中。另外,我不知道Express,但是在Koa,您可以自动导入路由,这样,您就不会每次都输入路由。模块的一个主要点是使不依赖于某些未指定的全局环境的可重用和独立可测试代码。因此,为了利用这一点,每个模块都应该
require()
import
自己的依赖项。只要习惯于将模块需要的任何东西放在模块顶部,即使你可能觉得自己在重复。这是良好模块化的要求。习惯这样做就好了。不要想办法破坏模块的一些优点,从而节省一点输入。