Node.js特定于模块的静态资源

时间:2011-10-12 20:31:25

标签: node.js static express router

是否有一种优雅的方法将静态客户端文件资源(脚本,图像等)捆绑到Express模块​​中并系统地避免命名冲突?注册静态对象的模块特定实例很容易,如下所示:

app.use(express.static(modulePath + '/public'));
app.use(express.static(__dirname + '/public'));

但是如果两个目录都包含“styles.css”文件,那么模块中的那个文件似乎会遮挡应用程序的那个。模块public中的子目录可用于避免此问题,但我真正想要的是一种将模块资源映射到任意路径的方法,以便

http://localhost:3000/mymodule/styles.css => <modulePath>/public/styles.css
http://localhost:3000/styles.css => <appPath>/public/styles.css

有没有办法做到这一点?我已经用编码技巧完成了它,所以我真的在寻找推荐的方法来完成它。此外,如果我遗漏了一些使这完全没必要的关键概念,我也想了解这一点。

2 个答案:

答案 0 :(得分:5)

您可以创建connect.static的另一个实例并在路线中使用它:

app = express.createServer()

app.configure(function(){
    app.use(express.static(__dirname+'/public'))
})

// new static middleware
var myModuleStatic = express.static(__dirname+'/mymodule')

// catch all sub-directory requests
app.get('/mymodule/*', function(req, res){
    // remove subdir from url (static serves from root)
    req.url = req.url.replace(/^\/mymodule/, '')
    // call the actual middleware, catch pass-through (not found)
    myModuleStatic(req, res, function(){
        res.send(404)
    })
})

app.listen(5555)

答案 1 :(得分:3)

这样的事情也应该有效:

app.use(express.static(__dirname + '/public'));    
app.use('/mymodule', express.static(modulePath + '/public'));

请参阅:http://groups.google.com/group/express-js/browse_thread/thread/c653fafc35fa85ed