Node.js、Express和Mongoose提供多个静态文件
Node.js, Express and Mongoose serving several static files
使用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');
});
// ...
}
相关文章:
- Grunt-connect在根目录之外提供静态文件
- 调用Javascript中的Python函数,读取静态文件(Flask)
- 使用CloudFront和AmazonS3,或者其他CDN,我可以将所有类似的请求发送到一个静态文件中
- 在使用 Django 静态文件时动态设置映像时,只有绝对路径才能与 jquery 一起使用
- Expressjs 静态文件不起作用
- 究竟是什么'提供静态文件'意思是
- 在Android Web视图中使用静态文件作为模板
- 无法使用express加载静态文件
- 如何使用页面.js和 Apache 路由/提供静态文件
- 从静态文件加载json时出错
- 如何使用Node Express提供静态文件
- 如何使用Node.js正确地为私有静态文件提供服务
- Django项目中第三方静态文件的推荐目录布局是什么
- 使用静态文件加载器进行角度翻译默认语言
- Django-开发服务器不提供管理静态文件
- 使用Karma读取静态文件
- 错误:找不到模块'html',可以't提供静态文件
- 如何在Java web应用程序中自动控制静态文件(css、js、image)的版本
- 如何使用flatiron/director在Node.js中提供静态文件
- 在crm 2011中重新整理和读取静态文件