无法使用express-subdomain引用单独的路由文件

时间:2016-05-11 19:44:46

标签: node.js express subdomain

我正在尝试使用Express 3.0和express-subdomain向现有节点应用添加子域。

(我已将子域添加到我的hosts文件中,并且工作正常。)

当前应用程序将所有路由放在与主文件相同的目录中的单独routes.js文件中,并且它的调用方式如下:

var routes = require("./routes")
//other stuff
routes.routeList(app);

我尝试了很多种方法来使用

app.use(subdomain('test-developer', [router]));

语法,我无法弄明白。

我试过

var router = require("./routes.js");
app.use(subdomain('test-developer', router));

我得到一个错误,如“第二个参数必须是一个处理fn(req,res,next)参数的函数。”

这里有一些代码:

//the developerRoutes.js file
var express = require('express');

exports.developerRouteList = function(app) {

var devRouter = express.Router();

devRouter.get('/', function(req, res) {
    res.send('hi!');
});

}

并从main.js文件:

var developerRoutes = require('./developerRoutes');
//...
var app = express();
app.use(subdomain('test-developer', developerRoutes.developerRouteList));
//force https with this: 
app.enable('trust proxy');

app.configure(function() {

  app.use(function (req, res, next){
    var hostname = ( req.headers.host.match(/:/g) ) ? req.headers.host.slice( 0, req.headers.host.indexOf(":") ) : req.headers.host 
    console.log(hostname)
    if ((hostname === 'localhost') || (hostname === 'test-developer.localhost') || req.secure) {
      // request was via https, so do no special handling
      next();
    } else {
      // request was via http, so redirect to https
      res.redirect('https://' + req.headers.host + req.url);
    }
});
  app.use(express.bodyParser());
  app.use(express.cookieParser('secret'));
  app.use(function(req, res, next){
    session = require("./routes/includes/session.js");
    next();
  });
  app.use(express.static('./public'));


  app.use(app.router);  
});

app.engine('ejs', engine);
app.set('views',__dirname + '/views');
app.set('view engine', 'ejs');
multiLess.configure(__dirname + '/static/less/', parentDirectory + 'public/css/',['main.less'],0);

routes.routeList(app);

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

根据您发布的代码,我会尝试以下步骤:

  1. developerRoutes.js中,exports.developerRouteList = function(app)应为module.exports = devRouter,且应在var devRouter = express.Router()之后。除非您在developerRoutes.js中放置多个路由器,否则您无需在developerRouteList对象中创建名为module.exports的子对象。此外,您似乎并未使用传递给app的{​​{1}}实例,因此可以更改此内容。
  2. developerRoutes.js,您现在可以尝试main.js

答案 1 :(得分:1)

express-subdomain的作者

我在之前的一期中回答了这个问题 - 请参阅https://github.com/bmullan91/express-subdomain/issues/4。我应该把它添加到自述文件中,因为还有一些人使用v3。