Javascript Node.js、Express和Mongoose提供多个静态文件
使用Node.js、Express和Mongoose,我使用以下代码在多个子目录中同步提供多个静态文件(工作正常): 但是,url的一部分必须是动态的,具体取决于数据库条目值: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) 我试过几种不同的方法,但都没有用。以下是我的第一次尝试,当时对我来说最有意义(应用程序模型是一个只能更新和检索的单一对象): 但是,这不起作用,因此不会提
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
vssite
),这就是原因吗?只是我在格式化要放在这里的代码时输入了一个错误。我已经编辑了以修复打字错误,因此它是有意义的。您能提供一个使用上述代码作为上下文的示例吗?我已经测试了上述代码以及其他一些异步理论,但问题仍然存在。我做了一些测试,发现了一些东西。。。以下代码有效: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');
});
// ...
}