我遇到过一个有趣的情况,我们正在使用快递应用程序组合:
const rootApp = express();
const moduleOne = express();
const moduleTwo = express();
rootApp.use(moduleOne);
rootApp.use(moduleTwo);
rootApp.listen(3000);
这些module
个应用程序中的每一个都有自己的路由器,中间件等等。我想知道在更高级别使应用程序组合与路由器组合有什么优点和缺点。
答案 0 :(得分:2)
它通常允许更好地隔离和使用中间件。例如,在构建使用单页Web应用程序(React,Ember,Angular等)的基于CRUD的应用程序时,我倾向于使用多个Express Applications(组合在一起)。这使我可以非常容易地为每个标题添加不同的标题。
它还可以很容易地将每个应用程序移动到它自己的回购中,如果您以后希望以自己的服务运行每个应用程序,这可能很有用。然后你可以使用类似nginx的东西来路由到两个应用程序。例如:
myapp.com/api/auth -> authentication express app
myapp.com/api -> general API
myapp.com/ -> light weight express app which serves the front end.
这使得以后扩展应用程序变得更加容易,并允许更细粒度的控制。
在短期内,对各种中间件的控制是我认为组合快速应用程序与组成快速路由器最有用的东西。这意味着你可以做" app.use()"并且往往会更好地阅读其他来到您项目的开发人员。
答案 1 :(得分:0)
app
是一个router
对象,其中包含一些与应用整体状态相关的属性和方法。 app
对象上的属性(如app.locals
)或app.listen()
等方法适用于整个应用,而不仅仅适用于一组路线。除此之外,您可以将app
视为router
的子类,其中包含添加了应用程序属性的路由器的所有功能。
如果查看source code for the app
object,您会看到它的实例数据中有一个路由器(不确定为什么它们实际上没有对它进行子类化):
this._router = new Router({...});
然后,对代码的进一步检查显示app.use()
,app.get()
等......都流经路由器上方。
因此,如果您需要的只是一个路由器,那么您的app
个对象就可以正常运行。但是,有理由使用多个路由器。例如,如果您有一系列子路由(比如以/api/xxx
开头的所有内容),您想要进行一些身份验证,但许多其他路由不需要该身份验证,那么您可以创建一个/api
的路由器,只在那个检查你的auth的路由器上定义中间件,然后在该路由器上定义子路由,你得到一个很好的封装子路由定义,所有子路由都有自己的中间件。