我正在使用一台服务器来托管多个Node.js网络应用程序,这些应用程序分布在多个域中.我目前的做法是为不同端口上的每个应用程序运行Express服务器,并运行只是将请求路由(重定向)到正确的端口/ Express服务器的基本服务器.这有效,但这意味着我的基本服务器正在路由每个HTTP请求(并通过手动重定向),并且我的用户将我的应用视为托管在[hostname.com]:8000.
经过一些研究,我发现我可以使用http-proxy来满足我的路由需求,但我仍然想知道在同一系统上运行多个Express服务器是否有最佳实践.这是我计划如何做的:
每个Web应用程序都有自己的文件夹,具有完整的Express文件夹结构(app.js,路由,视图等).应用程序将按域分组,因此示例文件夹结构将是:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
Run Code Online (Sandbox Code Playgroud)
我将不得不分别用节点(或永远,我目前正在使用)运行每个app.js ,并且每个都必须在内部使用不同的端口,并且跨应用重定向指向端口目标应用.
那么,这是我目前的计划.有什么问题,我应该避免哪些陷阱?最重要的是,是否有针对此问题的既定解决方案 - 使用Node.js/Express在同一系统上托管多个Web应用程序的问题?
编辑:我计划最终使用WebSockets和HTTPS,我的设置可以支持的带宽量对我来说并不重要 - 这是一个开发服务器(至少现在).感谢David Ellis提出的WebSockets问题.
第二次编辑:感谢EhevuTov和David Ellis的回答,两者都有很大帮助.我仍在为我的应用程序确定一个整体结构,看起来这个问题通过StackOverflow问题得到了详细解决
第三次编辑:自从发布这个问题以来我已经找到了一些方法(尽管我还有很长的路要走).在我的GitHub存储库中查看这个文件,它利用了我从这个问题的答案中学到的东西!
我是node.js的新手并且表达并且已经尝试了一段时间.现在我对与解析请求体相关的快速框架的设计感到困惑.来自快递的官方指南:
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);
Run Code Online (Sandbox Code Playgroud)
在设置了所有中间件之后,我们添加了我们想要处理的路由:
app.post('/test', function(req, res){
//do something with req.body
});
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,在检查路由有效性之前,将首先解析所有请求主体.解析无效请求的主体似乎效率很低.更重要的是,如果我们启用上传处理:
app.use(express.bodyParser({uploadDir: '/temp_dir'}));
Run Code Online (Sandbox Code Playgroud)
任何客户端都可以通过上传任何文件来轰炸服务器(通过向任何路由/路径发送请求!!),所有这些都将被处理并保存在'/ temp_dir'中.我无法相信这种默认方法正在被广泛推广!
我们当然可以在定义路径时使用bodyParser函数:
app.post('/test1', bodyParser, routeHandler1);
app.post('/test2', bodyParser, routeHandler2);
Run Code Online (Sandbox Code Playgroud)
甚至可能在处理路径的每个函数中解析主体.但是,这很麻烦.
是否有更好的方法可以仅对所有有效(已定义)路由使用express.bodyParser,并且仅在选定路由上使用文件上载处理功能,而无需重复执行大量代码?
我一直认为在服务器上使用NodeJS的一大好处是可能在服务器端和客户端之间共享代码(例如输入验证).现在我实际上正在使用NodeJS进行开发,我发现的一个难点是确定执行每个代码体的责任和上下文.下面我将列出一些我曾经遇到过的困难,希望能够对我可能忽略的惯例或指导有所启发,这有助于提升这些问题.
构建时间代码
以遵循基本文档的方式构建使用Gulp,Grunt或vanilla NPM的项目的时间代码通常很容易理解.大多数较小的项目倾向于将所有代码保存在单个文件中,并且文件往往被命名为传统名称,如gulpfile.js,但是对于更大的项目,我看到这些脚本开始被拆分.我已经看到一些gulp文件被拆分成多个文件并放在一个单独的目录下的情况.更糟糕的是,我发现gulpfile.js文件甚至没有这样命名的情况导致新开发人员寻找gulpfile所在的位置,一旦找到它,gulp命令总是必须运行特定的- -gulpfile选项.
运行时服务器端代码
基本节点应用程序的入口点似乎只需要在运行node命令时指出特定的JavaScript文件(例如node script.js).对于Web服务器应用程序,例如那些使用Express的应用程序,我注意到按照惯例,入口点文件通常称为server.js,通常可以在应用程序的根目录中找到.在某些其他情况下,例如在开发人员环境中运行Web服务器时,我看到gulp任务负责启动Node.在这些情况下,似乎有多种方法可以包含入口点,但我发现的一个例子就是启动webpack编译器,然后是入口点脚本的require语句.在这种类型的设置中,弄清楚如何结合关于如何完成典型节点调试命令的正常指导是非常重要的.除了应用程序的入口点之外,似乎没有关于NodeJS/Express应用程序的目录结构的任何一般指导,这些应用程序将服务器端特定代码保存在其中以帮助定位它并使其与构建时间和客户端代码.
服务器端代码既用于提供静态内容,服务器端生成的视图(例如使用MVC),也用于向客户端提供API,服务器端故事变得更加复杂.侧.我倾向于将API与应用程序项目分开,但我从其他人那里得到的感觉是,这样做有一种过于复杂的感觉,我将其视为合理的关注点分离.
运行时客户端代码
由于客户端代码通常可以根据请求的第一页具有各种入口点,因此这可能很棘手.但是,由于URL的一般透明性以及它们如何映射到典型情况下的资源,以及调试工具在现代浏览器中的强大程度,因此遵循脚本并不会太麻烦.对于典型的构建过程而言,难以替代客户端代码,这通常最终会复制文件并将它们放置在不同名称下的生产类结构中.一个例子是一个项目,它有一个名为src或js的文件夹,它保存客户端和服务器端代码混合,除了只有一部分文件碰巧包含在构建任务中,该任务转换并经常连接文件和将它们放在分发文件夹中.我见过的这些分发文件夹的常用名称是dist,public,www和wwwroot.通常,如果不总是这些目录位于项目的根目录,这至少使得它更容易定位而无需询问构建脚本.
我希望有一些一般指导如何将所有这些结合在一起,或许是一个权威的来源,主要是为那些像我一样可能想要从右脚开始的人提供指导.作为副作用或许能够引用某种标准,即使它是一个松散的标准,也可能减少团队在开始时发明和讨论的样板数量.在上面列出的每个上下文中,显然会有一些技术特定的约定,例如客户端的AngularJS,Meteor或ReactJS遵循的约定.我正在寻找的约定更具体地分离端到端JavaScript应用程序中的主要高级上下文,其中语言和平台不再是区分每种语言和平台的明显方式.
我想知道如何在Express.js中构建路由的选项.这是我的应用目录:
??? public
? ??? images
? ??? javascripts
? ? ??? showLogin.js
? ? ??? showSignup.js
? ??? stylesheets
? ??? dash.styl
? ??? reset.styl
? ??? space.styl
? ??? style.css
? ??? style.styl
? ??? typography.styl
??? routes
? ??? index.js
??? views
? ??? dash.jade
? ??? index.jade
? ??? layout.jade
? ??? space.jade
??? app.js
??? package.json
Run Code Online (Sandbox Code Playgroud)
是否最好将routes/index.js分解为多个单一路径文件?哈哈,我试过这个,显然我并不擅长这个.
另一个选择是在某处引入一个lib目录.人们通常会在哪里做到这一点?
任何其他建议都会摇滚!
我正在启动一个express.js项目.我想看看退出大型应用程序的代码,尤其是它们的文件系统结构.任何人都知道使用express.js并在github上的应用程序?
我想在开发中使用本地 mongo 服务器,然后在生产中切换到 mongolab db。在 node.js express 应用程序中执行此操作的推荐方法是什么?我所知道的是 NODE_ENV 存在但不确定根据其值切换数据库的最佳方法。拥有:
if (process.env.NODE_ENV == "production")
{
//
}
else if ((process.env.NODE_ENV == "development")
{
}
Run Code Online (Sandbox Code Playgroud)
我查询数据库的所有地方似乎都不是很优雅。有没有办法做到类似于铁路应用程序,您可以在其中指定用于生产和开发的适配器?
我正在创建平均堆栈应用程序。如何使用 Express js 创建结构化后端源,例如:控制器、模型、路由等。我需要一些例子吗?
node.js ×8
express ×5
.net ×1
build-time ×1
connect ×1
http-proxy ×1
javascript ×1
mean-stack ×1
mongodb ×1
mvp ×1
organization ×1
runtime ×1
vhosts ×1