3

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

4

3 回答 3

3

请参阅express github 存储库上的 vhost 示例

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

主应用程序.js

用于启动服务器的文件。

// load dependencies

var main = express();

main.use( express.vhost( 'mobile', require( './the-mobile-app' ) );
main.use( express.vhost( '*', require( './the-web-app' ) );

main.listen( /*...*/ )

the-mobile-appthe-web-app.js

var app = express();
//
// setup your application conf, middleware, and routes
//
module.exports = app;
于 2013-06-21T10:47:07.250 回答
3

你在 express 中做的app对象是一个函数(req,res,next),适用于 Express 自己的中间件链。因此,您可以使用app.use将与前导路径片段匹配的请求发送到在别处定义的应用程序。

文档:http ://expressjs.com/api.html#app.use

$ npm install express

//mobile.js
var app = require('express')();
app.get('/', function(req, res){ 
  res.send('Mobile Route') 
});
module.exports = app;


//desktopApp.js
var http = require('http');
var express = require('express');
var desktopApp = express();
var mobileApp = require('./mobile.js');

desktopApp.use('/mobile', mobileApp)
desktopApp.use(desktopApp.router);
desktopApp.use(express.errorHandler());

desktopApp.get('/', function(req, res){ 
  res.send('Desktop Route') 
});

desktopApp.get('/mobile', function(req, res){ 
  // Because Express respects the order that you set up the middleware chain,
  // the mobileApp `/mobile` route gets first dibs to send a response or next()
  res.send('Inaccessible Desktop Route') 
});

desktopApp.get('/mobile/foobar', function(req, res){ 
  // When mobileApp can't find any suitable route matching this path, it gives
  // up, and desktopApp continues to pass the request down the middleware stack.
  // It ends up matching this route, where we send a response
  res.send('Desktop Route') 
});

http.createServer(desktopApp).listen(3000, function(){
  console.log('Listening on 3000');
});


// Results
$ curl localhost:3000/
Desktop Route

$ curl localhost:3000/mobile/
Mobile Route
于 2013-06-21T13:38:25.667 回答
-1

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

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')
);
于 2013-06-21T17:05:21.267 回答