Node.js expressjs中的两个应用程序

Node.js expressjs中的两个应用程序,node.js,express,Node.js,Express,我正在用ExpressJS构建一个应用程序,它将有不同的客户端,如web和移动。我不想同时使用一个应用程序,因为一些中间件将是额外的负担。比如说,会话中间件。那么一个项目有可能有两个应用程序吗。它是如何工作的?请参见。 你可以有一个“主”应用程序,它将请求路由到一个或另一个应用程序。您应该编写一个中间件来建立请求一个或另一个应用程序的条件express.vhost是一个很好的例子,但可能您需要域之外的其他检查 main-app.js (调用该文件以启动服务器。) //加载依赖项 var main

我正在用ExpressJS构建一个应用程序,它将有不同的客户端,如web和移动。我不想同时使用一个应用程序,因为一些中间件将是额外的负担。比如说,会话中间件。那么一个项目有可能有两个应用程序吗。它是如何工作的?

请参见。 你可以有一个“主”应用程序,它将请求路由到一个或另一个应用程序。您应该编写一个中间件来建立请求一个或另一个应用程序的条件
express.vhost
是一个很好的例子,但可能您需要域之外的其他检查

main-app.js (调用该文件以启动服务器。)

//加载依赖项
var main=express();
main.use(express.vhost('mobile',require('./移动应用程序'));
main.use(express.vhost('*',require('./web应用程序'));
main.listen(/*…*/)
移动应用程序
web app.js
var-app=express();
//
//设置应用程序配置、中间件和路由
//
module.exports=app;

您在express中创建的
应用程序
对象是一个函数(req、res、next),适用于express自己的中间件链。因此,您可以使用
应用程序。使用
发送与其他地方定义的应用程序匹配的请求

文件:


我想分享我最近在一个项目中使用的不同方法:

function renderAppropriate(template1, template2){
  return function(req, res){
    if(req.session && req.session.mobileOn){
      res.render(template1);
    } else {
      res.render(template2);
    }
  };
};

app.get('/', function(req, res, next){
  // do some stuff
  next()
}, renderAppropriate('someMobileTemplate', 'someDesktopTemplate')
);

那么,它们要么在两个单独的端口上侦听,要么单独部署?看看路由特定中间件。当中间件在服务器端运行时,为什么会话中间件会成为移动设备的负担?@robertklep这是因为来自移动设备的每个请求也必须通过该中间件在不需要的地方,相反,我可以在那个地方使用Oauth中间件。@alexjamesbrown是的……我正在考虑在代理服务器后面使用一个不同的端口,比如Nginx@SaranshMohapatra你对移动会话中间件组合有什么实际问题需要你重写吗?我很感兴趣n听人如何(非常简单)会话中间件可能会成为移动客户端的一个问题。它是一个很好的使用选项……但我想知道这样做是否会降低每个请求的速度。如果我想在Nginx这样的代理服务器后面托管应用程序,会怎么样?即使你在代理服务器后面托管应用程序,性能影响也是最低的。这是一个在middleware链,因此速度非常快。此外,使用这种方法,您有两个完全独立的应用程序,可以独立部署,因此如果需要,可以轻松扩展后端资源。好的。因此,您认为这比使用robertklep提到的条件中间件要好。这种方法类似。robertklep和Plato pro为一个应用程序设置条件中间件,而我为移动和网站建议1个主应用程序和条件中间件+2个子应用程序。如果移动和web应用程序之间共享大量代码,我的建议毫无意义。如果它们是真正独立的应用程序,这种方式更适合维护。好的。谢谢。我明白你的意思。B但如果我计划将手机的服务器应用部署到子域中,你的似乎是一个更好的选择,我认为这是一件好事。你的意见是什么?我从未使用过@Iaconbase的vhost功能,我不能说这些方法的相对优势。你的方法似乎很好。我只是在猜测,但如果我要使用一些常见的中间件比我将其置于移动应用中间件之上的中间件好吗???@Plato是内置的。无论如何,如果两个应用程序相似,最好是采用类似于您的方法,我的建议假设应用程序是完全独立的。是的,中间件高于
app.use('/mobile',mobileApp)
将同时运行。Express将沿着中间件链传递请求,直到有东西发送响应。(或者您的代码既不发送响应也不调用
next()
,在这种情况下,它将挂起。)我在外部应用程序中添加了另一个路由
/mobile/foobar
,显示Express如何将请求传递到mobileApp,然后返回到desktopApp中间件堆栈的其余部分。(因为mobileApp并不设计响应此请求。
/mobile
在发送响应时从不将其返回mobileApp。)我不知道你为什么发布这个答案,因为我不想为移动浏览器提供不同的模板。这是一个应用程序移动客户端的api。我希望你现在能够理解为什么你的答案在这里无效。是的,那很好,我发布了这个,因为它以不同的方式解决了类似的问题,可能对你有用找到此页面的其他人:)
function renderAppropriate(template1, template2){
  return function(req, res){
    if(req.session && req.session.mobileOn){
      res.render(template1);
    } else {
      res.render(template2);
    }
  };
};

app.get('/', function(req, res, next){
  // do some stuff
  next()
}, renderAppropriate('someMobileTemplate', 'someDesktopTemplate')
);