我有一个Node.js服务器,它实现了一组我想作为默认值的基本文件。然后服务器的其他用户可以要求()它并重载一些默认值,并可能添加其他文件。例如:
server_base
/site
-> index.html 'A'
-> images 'A'
-> icon.jpg
user_server (requiring server_base)
/site
-> index.html 'B'
-> images 'B'
-> picture.jpg
生成的网站将包含这些文件的合并集合,其中用户的index.html优先于基础。
到目前为止,我一直试图用express来实现这一点,因为use()方法应该允许建立这个层次结构。
server_base.js
var express = require('express'),
app = module.exports = express(),
server = null;
app.configure( function() {
server = require('http').createServer(app);
app.use('/', express.static(__dirname + '/site'));
server.listen(80);
});
user_site.js
var express = require('express'),
app = express(),
sb = require('../server_base');
app.configure( function() {
app.use('/', express.static(__dirname + '/site'));
app.use(sb); // server_base configure occurs here
});
据我了解,如果express在第一个引用的根路径(在本例中为user_site)中找到所请求的文件,它应该返回该文件。如果没有,并且在其他路径中找到它,它应该返回该文件(server_base)。我所看到的是,无论第二次使用的呼叫('/',......),'/'路径都被彻底消灭了。
我想也许是两次调用configure()并有效地消除了设置。所以我尝试从server_base导出它的站点路径,以便user_site将app.use(...)它自己的路径,然后是server_base。这导致网站以某种方式无法提供任何文件。
我对Node.js和Express都很陌生,所以如果有一个更好/更清晰的方法来制作一个易于分发和扩展的server_base,我愿意接受替代方案。
答案 0 :(得分:0)
中间件的顺序很重要。在用户有时间添加静态处理程序之后,您需要让服务器库添加它的静态处理程序,如下所示:
user_site.js:
var express = require('express'),
app = express(),
sb = require('./server_base');
app.use('/', express.static(__dirname + '/site'));
sb(app); // server_base configure occurs here
app.listen(8080);
server_base.js:
var express = require('express');
module.exports = function(app) {
app.use('/', express.static(__dirname + '/site'));
return app;
};