为什么不导出我的控制器?

问题描述 投票:0回答:1

我正在尝试编写一个文件,该文件将插入,并自动为Express项目导出所有控制器。由于某种原因,它将无法正常工作。我对Node和Express还很陌生。这是代码:

// export all controllers

const fs = require('fs');
const path = require('path');
const controllers = new Object();

(async () => {
    fs.readdir('./controllers', async (err, files) => {
        if (err) throw err;
        await files.forEach(file => {
            if (file !== 'index.js') {
                const i = path.basename(file).indexOf('.');
                const fn = path.basename(file).slice(0, i); 
                controllers[fn] = require(path.join(__dirname, file));
            }
        });
    });
})();

module.exports = controllers;

如果我将导出记录到控制台,则会得到一个空对象,即使我知道代码可以正常工作。这应该做的是需要所有控制器类,然后将它们导出到一个对象中,该对象以类的名称作为键,而类本身作为值。

javascript node.js express
1个回答
1
投票

您目前无法使用异步操作来创建要导出的内容。导出同步进行,但是在导出时,尚未用任何属性填充controllers对象。

因此,导入的模块将获得一个空对象(该对象最终将被填充,但是在他们尝试使用它时可能会为空)。

因为这只是模块初始化代码,所以一个简单的解决方案是使用同步文件I / O而不是异步文件I / O,以便在导出对象之前分配控制器对象的属性。

模块初始化是可以的几次,甚至可能需要在服务器中使用同步文件I / O。实际上,出于相同的原因,require()使用同步文件I / O。

const fs = require('fs');
const path = require('path');
const controllers = {};

const files = fs.readdirSync('./controllers');
files.forEach(file => {
    if (file !== 'index.js') {
        const i = path.basename(file).indexOf('.');
        const fn = path.basename(file).slice(0, i); 
        controllers[fn] = require(path.join(__dirname, file));
    }
});

module.exports = controllers;

P.S。您对asyncawait的使用在这里无济于事。您没有在等待诺言,async函数仍然处于非阻塞状态,因此仍在分配module.exports并分配模块返回属性之前返回模块。

© www.soinside.com 2019 - 2024. All rights reserved.