Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js、Express和Mongoose提供多个静态文件_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

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

Javascript Node.js、Express和Mongoose提供多个静态文件,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,使用Node.js、Express和Mongoose,我使用以下代码在多个子目录中同步提供多个静态文件(工作正常): 但是,url的一部分必须是动态的,具体取决于数据库条目值: express.static(__dirname + "/../../../np-site/themes/" + theme + "/client/" + dir) 我试过几种不同的方法,但都没有用。以下是我的第一次尝试,当时对我来说最有意义(应用程序模型是一个只能更新和检索的单一对象): 但是,这不起作用,因此不会提

使用Node.js、Express和Mongoose,我使用以下代码在多个子目录中同步提供多个静态文件(工作正常):

但是,url的一部分必须是动态的,具体取决于数据库条目值:

express.static(__dirname + "/../../../np-site/themes/" + theme + "/client/" + dir)
我试过几种不同的方法,但都没有用。以下是我的第一次尝试,当时对我来说最有意义(应用程序模型是一个只能更新和检索的单一对象):

但是,这不起作用,因此不会提供静态文件

我需要访问的对象是可用的(通过console.log发现),但有些地方不正确

浏览器控制台确实会返回一条罕见的错误消息,指出文件的MIME类型(CSS)不正确,但我相信这是因为应用程序找不到正确的目录(完全删除该方法会产生相同的结果)

我认为这与猫鼬方法中的app.use有关,但我不确定


有人能给这个受挫的灵魂点启示吗?我觉得自己走错了路。

问题在于,您正在异步添加中间件(因为
App.find()
很可能执行异步操作),这会导致在所有静态定义的中间件和路由处理程序之后添加(可能)动态中间件

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

解决方案是延迟添加任何其他中间件或路由处理程序,直到
fs.readdirSync()
(但在
App.find()
回调中)之后。一种简单的方法是,只需将其他中间件和路由处理程序添加项放在函数中,然后在
fs.readdirSync()
之后调用该函数:


您的路径不同(
np-site
vs
site
),这就是原因吗?只是我在格式化要放在这里的代码时输入了一个错误。我已经编辑了以修复打字错误,因此它是有意义的。您能提供一个使用上述代码作为上下文的示例吗?我已经测试了上述代码以及其他一些异步理论,但问题仍然存在。我做了一些测试,发现了一些东西。。。以下代码有效:
app.use(express.static(uu dirname+“/../../../../../np site/themes/default/client/css”)但是当它被包装在Mongoose服务器调用中时:
App.find(函数(err,appSettings){App.use(express.static(uu dirname+“/../../../../np site/themes/default/client/css”);}它不工作。我一定错过了什么。我解释了为什么那样不行。您的
App.find()
回调函数将在以后的某个时候,在脚本的其余部分已经执行之后被调用。您需要延迟执行,正如我在示例中所示。我的大多数中间件和路由处理程序都位于多个目录中的独立文件中—这似乎是问题所在。您对回调地狱场景的理解是100%正确的,我在需要上述代码模块的文件中使用了一个承诺来解决这个问题。你的反馈非常有用!
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)
        );
    });
});
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');
  });
  // ...
}