使用模块化Node.js合并站点根的方法

时间:2014-02-27 15:58:35

标签: javascript node.js express

我有一个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,我愿意接受替代方案。

1 个答案:

答案 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;
};