Node.js、Express和Mongoose提供多个静态文件

Node.js, Express and Mongoose serving several static files

本文关键字:静态 文件 Mongoose js Express Node      更新时间:2023-09-26

使用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.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');
  });
  // ...
}