【问题标题】:Node.js, Express and Mongoose serving several static filesNode.js、Express 和 Mongoose 提供多个静态文件
【发布时间】:2016-02-25 03:47:02
【问题描述】:

使用 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 有关,但我不确定。

有人可以为这个沮丧的灵魂提供一些启示吗?我觉得我好像走错了路。

【问题讨论】:

  • 你的路径不同(np-site vs site),这是为什么?
  • 只是一个错字,因为我正在格式化代码以放置在这里。我已经编辑以修复错字,所以它是有道理的。

标签: javascript node.js mongodb express mongoose


【解决方案1】:

问题是您异步添加中间件(因为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');
  });
  // ...
}

【讨论】:

  • 您能提供一个使用上述代码作为上下文的示例吗?
  • 我已经测试了上面的代码以及其他一些异步理论,问题仍然存在。我正在执行一些测试并发现了一些东西......以下代码有效:app.use(express.static(__dirname + "/../../../np-site/themes/default/client/css")); 但是当它包含在 Mongoose 服务器调用中时:App.find(function (err, appSettings) { app.use(express.static(__dirname + "/../../../np-site/themes/default/client/css")); }); 它不起作用。我一定是错过了什么。
  • 我解释了为什么这不起作用。您的 App.find() 回调在未来某个时间被调用,在您的脚本的其余部分已经执行之后。您需要像我在示例中展示的那样延迟执行。
  • 我的大多数中间件和路由处理程序都位于多个目录中的单独文件中 - 这似乎是问题所在。您在回调地狱场景中是 100% 正确的,我通过在需要上述代码模块的文件中使用承诺来解决这个问题。您的反馈非常有帮助!
猜你喜欢
  • 2017-11-24
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多