我正在使用 Babel 和 ESLint 在 Express 中设置一个全新的项目,我正在尝试设置动态路由。唯一的问题是我无法弄清楚如何为路由调用加载器。这是我目前关于装载机的代码。
的路由/ index.js
import fs from 'fs';
/**
* Register Default Routes
* @param {Object} app express.Application
*/
export default function(app) {
fs.readdirSync(__dirname).forEach((fileName) => {
if (fileName == __filename.slice(__dirname.length + 1)) return;
let fileNameStripped = fileName.substring(0, fileName.lastIndexOf('.'));
require('./' + fileNameStripped)(app); // does not work
});
}
index.js
import express from 'express';
import routes from './routes/index.js';
const app = express();
app.use(express.static('public'));
routes(app); // works now
...
Babel错误
TypeError: require(...) is not a function
at /app/build/routes/index.js:1:314
at Array.forEach (<anonymous>)
at exports.default (/app/build/routes/index.js:1:195)
at Object.<anonymous> (/app/build/index.js:1:393)
at Module._compile (module.js:649:30)
at Object.Module._extensions..js (module.js:660:10)
at Module.load (module.js:561:32)
at tryModuleLoad (module.js:501:12)
at Function.Module._load (module.js:493:3)
at Function.Module.runMain (module.js:690:10)
有关
答案 0 :(得分:1)
由于嵌套路由文件应该是具有default
导出的ES模块,因此require('./' + fileNameStripped)
是模块对象而不是函数。它应该是:
require('./' + fileNameStripped).default(app);
根据Babel配置(dynamic-import-node
插件是必需的),require()
可以替换为动态import()
,但这里不太理想,因为动态import
不是同步的会导致竞争条件。