Node.js Express:在另一个应用程序中require/use一个应用程序

8
我面临以下情况。为了进一步模块化我的软件开发,我已经编写了一些标准模块。例如,基于Express和Passport的登录模块,允许用户使用各种社交服务进行登录。该模块还包含用户管理、登录、注册、个人资料等UI。
现在,我想做的事情就是将Auth应用程序文件夹(包含Express应用程序、所有路由、视图、模型、设置和依赖项)放入另一个Express应用程序中(例如CMS),然后使用类似于require('./lib/auth/app.js')的东西加载它。我知道这是可能的,请看Kue
那我该怎么做呢?如何管理命名空间问题?我可以为每个路由添加/auth/,但我可以想象设置(app.use())和公共文件夹会与“父”app.js的设置和公共文件夹冲突。
谢谢您的帮助。
Fabian
1个回答

7
我想我找到了答案。所以,我找到了 这个问题这个问题。我猜我的术语用错了。
我通过做一些事情来解决了我的问题。首先,我改变了所有路由和url的“命名空间”(不是真的,但这样做可以完成任务)。现在,所有路由都有 /auth/ 前缀。我对所有链接也做了同样的处理,所以所有内容都正常工作。
接下来,我从 app.js 中删除了服务器部分。所以,我不再使用以下代码: require('http').createServer(app).listen(app.get('port')); 而是只需要: module.exports = app; 然后我向 app 对象添加了一些自定义方法:
app.isLoggedIn = auth.isLoggedIn;
app.notLoggedIn = auth.notLoggedIn;

然后,在我的根应用程序中,我只需要以下操作来加载auth应用程序。路由,公共文件和所有其他内容都会自动发生。非常酷。

var auth = require('./vendor/auth/app');
var app  = express();

app.configure(function() {
    app.use(auth); // use our auth app

    // do a lot of root-app related stuff...
});

还有一些事情需要完成:

我的auth应用程序使用了一些会话(session)内容。根据第二个链接的解释,如果我理解正确,在auth应用程序中的app.use(session...)部分将被app.use覆盖。此外,我想定义一个EJS(helper)来生成我的URL(类似于site_url('/facebook/callback'), 然后指向 /auth/facebook/callback)。最后,我需要包含来自根应用程序的设置。我考虑将我的整个app.js(在auth中)封装在一个函数中,向该函数传递一个配置对象,像这样:

module.exports = function(config) {
    var app = express();

    app.set('config', config);
    // various app settings, routes, etc

    // return app so it's available in my root.
    return app;

}

我希望这能有所帮助。如果您需要更多信息,我可以尝试将一些代码张贴到gist上。只需让我知道即可!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接