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

标签 javascript node.js mongodb 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 必须是动态的,具体取决于数据库条目值:

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/

相关文章:

javascript - Mongoose 模型,为什么我需要使用 "new"? ( typescript )

javascript - 等待用户在 Javascript 中完成下载 blob

node.js - 使用 express-session 和 connect-session-sequelize 时 this.sessionModel.find 不是函数

node.js - AWS lambda api 网关错误 "Malformed Lambda proxy response"

node.js - Nodejs中的"BadValue Unsupported projection option"错误

mongodb - 分析 MongoDB 的 diagnostic.data 文件

asp.net - IE8 下的慢 javascript

javascript - 将带有 <button type ="submit"> 的表单提交到同一页面

node.js - Firebase 功能访问 Google API(用于应用内购买信息)的服务帐户身份验证失败

java - 在测试模式下运行时,Play 框架中的 Mongodb 中没有数据