Node.js,Express和Mongoose服务几个静态文件

使用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必须是dynamic的:

 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发现),但有些不对。

浏览器控制台确实返回一个不经常出现的错误消息,说明文件(CSS)的MIMEtypes不正确,但我相信这是因为应用程序无法find正确的目录(删除方法完全具有相同的结果)。

我在想,它与一个Mongoose方法中的app.use有关,但我不确定。

有人可以向这个沮丧的灵魂倾泻一些光吗? 我觉得我走错了路。

问题在于你正在asynchronous添加你的中间件(因为App.find()很可能是在执行一个asynchronous操作),这会导致你的dynamic中间件被添加(可能) 所有静态定义的中间件和路由处理器之后。

Express按照添加的顺序执行中间件和路由处理程序。

解决办法是延迟添加任何其他中间件或路由处理程序,直到你的fs.readdirSync() (但在你的App.find()callback)之后。 一个简单的方法是简单地将其他中间件和路由处理程序添加到您在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'); }); // ... }