我正在尝试创建映射其自己的路线的节点模块。我在下面提供了一个简化的示例(删除了返回的对象中映射的所有其他函数以及任何代码以简化示例)。
我最初的尝试是这样做:
文件:web-core.js
function initRoutes(app) {
var express = require('express');
var router = express.Router();
router.get("/basic", function(request, response) {
response.json({ success: true, path: '/auth/basic' });
});
router.get("/oauth2", function(request, response) {
response.json({ success: false, path: '/auth/oauth2' });
});
router.get("/openid", function(request, response) {
response.json({ success: false, path: '/auth/openid' });
});
app.use('/auth', router); // mount the module
}
function init(app) {
initRoutes(app); //-- This does work (but don't like it)
//initRoutes(require('express')()); //-- This does NOT work!
}
module.exports = (function() {
return {
init : init
};
}());
从我的 Node 入口点:
var express = require('express');
var app = express();
app.use(express.static('public'));
var webAuth = require("./web-auth.js");
webAuth.init(app); //-- Wish I didn't have to call this!
var listener = app.listen(process.env.PORT, function () {
console.log('Your app is listening on port ' + listener.address().port);
});
现在,我的主要目标是不必打电话webAuth.init(app)
(并间接使用initRoutes(require('express')());
反而)。我希望该模块不依赖于显式或外部初始化。
但由于某种原因,当我使用initRoutes(require('express')());
它就是行不通。似乎只有当我打电话时才有效webAuth.init(app)
并传入app
object.
我不确定我在这里缺少什么。我被告知 Node 将缓存返回的所有实例require('express')
,因此从技术上讲,两种方法应该是相同的并且工作原理相同。
All the express.Router()
我在网上看到的示例提供了简单的用例,而不是像我试图做的那样“模块化”。
有谁知道为什么它不起作用?
更新:2018.02.04 18:27
我创建了一个带有示例代码的 Glitch 项目,以便任何人都能理解,可以找到here https://glitch.com/edit/#!/jeach-node-modules?path=README.md:1:0.
似乎总是存在这样那样的问题。要么缺乏文档,要么一些神秘的“东西”不起作用。
因此,根据提供的答案,我决定从外部初始化,例如:
var webAuth = require("./web-auth.js");
webAuth.init(app, router);
在我的模块中,我现在有:
function init(app, router) {
console.log("### Initializing '" + MODULE_NAME + "' module for '" + BASE_PATH + "'");
initFilters(router);
initRoutes(app, router);
}
这效果很好。当我打电话时GET /auth/basic
,我的过滤器和/auth/*
路线按预期工作。
但是现在,我开始创建第二个特定于域的模块,所以我们会说 API 应该映射到/domain/*
。显然,第二个模块现在应该使用一个新实例express()
and express.Router()
, 不?否则重复使用相同的东西就没有意义了。
所以当我这样称呼时:
app = express();
router = express.Router();
var webDOMAIN= require("./web-domain.js");
webDOMAIN.init(app, router);
您希望该模块也可以在/domain/*
路径...但事实并非如此!该死,使用 NodeJS 和 ExpressJS 真是令人沮丧。事实证明,在我 30 多年的经验中,我对这两种技术的体验似乎比其他任何技术都更令人沮丧。
更新:2018.02.06 10:59
好吧,我终于想通了!!!我不会将所有内容都发布在这里,而是对我自己的问题写一个广泛的答案。