我正在尝试编写一个文件,该文件将插入,并自动为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;
如果我将导出记录到控制台,则会得到一个空对象,即使我知道代码可以正常工作。这应该做的是需要所有控制器类,然后将它们导出到一个对象中,该对象以类的名称作为键,而类本身作为值。
您目前无法使用异步操作来创建要导出的内容。导出同步进行,但是在导出时,尚未用任何属性填充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。您对async
和await
的使用在这里无济于事。您没有在等待诺言,async
函数仍然处于非阻塞状态,因此仍在分配module.exports并分配模块返回属性之前返回模块。