使用 Node.js、Express 和 Mongoose,我使用以下代码(工作正常)在多个子目录中同步提供多个静态文件:
fs.readdirSync(__dirname + "/../../../np-site/themes/default/client/")
.forEach(function (dir) {
app.use(express.static(__dirname +
"/../../../np-site/themes/default/client/" + dir)
);
});
但是,部分 url 必须是动态的,具体取决于数据库条目值:
express.static(__dirname + "/../../../np-site/themes/" + theme + "/client/" + dir)
我试了好几种方法,都没有用。以下是我的第一次尝试,当时对我来说最有意义(App 模型是一个单一的对象,只能更新和检索):
App.find(function (err, appSettings) {
fs.readdirSync(__dirname + "/../../../np-site/themes/" + appSettings[0].theme +
"/client/").forEach(function (dir) {
app.use(express.static(__dirname + "/../../../np-site/themes/" +
appSettings[0].theme + "/client/" + dir)
);
});
});
然而,这不起作用,因此不会提供任何静态文件。
我需要访问的对象可用(通过 console.log 发现),但有些地方不对。
浏览器控制台偶尔会返回一条错误消息,指出文件的 MIME 类型 (CSS) 不正确,但我相信这是因为应用无法找到正确的目录(完全删除该方法会产生相同的结果)。
我认为它与 Mongoose 方法中的 app.use 有关,但我不确定。
有人可以为这个沮丧的灵魂提供一些启示吗?我觉得我走错了路。
最佳答案
问题是您正在添加中间件异步(因为 App.find()
很可能执行异步操作),这会导致您的动态中间件在所有静态定义的中间件和路由处理程序之后被添加。
Express 按照添加的顺序执行中间件和路由处理程序。
解决方案是延迟添加任何其他中间件或路由处理程序,直到您的fs.readdirSync()
(但在您的App.find()
回调)。一个简单的方法是简单地将您的其他中间件和路由处理程序添加到您在 fs.readdirSync()
之后调用的函数中:
var baseThemePath = __dirname + "/../../../np-site/themes/";
App.find(function (err, appSettings) {
var themePath = baseThemePath + appSettings[0].theme + "/client/";
fs.readdirSync(themePath).forEach(function(dir) {
app.use(express.static(themePath + dir));
});
setupStatic();
});
function setupStatic() {
app.use(express.static('public'));
app.get('/', function(req, res) {
res.send('Hello world');
});
// ...
}
关于javascript - Node.js、Express 和 Mongoose 提供多个静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33864238/