【问题标题】:having trouble referencing separate routes file with express-subdomain无法使用 express-subdomain 引用单独的路由文件
【发布时间】:2016-05-11 19:44:45
【问题描述】:

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

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

当前应用的所有路由都在一个单独的 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);

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 你能从 routes.js 文件中发布任何内容吗?比如它出口或返回的东西?
  • 哦,当然——它导出“exports.routeList”,它需要一堆单独的 js 文件,这些文件被路由引用,例如("app.get('/', datafree.home);" 所以它需要 "datafree.js"
  • exports.routeListexpress.Router 的实例吗?根据 express-subdomain 文档,看起来这就是您调用 subdomain() 时子域函数所期望的,因此您将拥有 subdomain('test-developer', <instance of express.Router>)
  • 谢谢!不是......当我添加 var devRouter = express.Router(); devRouter.get('/', function(req, res) { res.send('hi!'); });到主文件,它给了我一个“无法读取未定义的属性'get'”;当我将它添加到所需的文件时,我仍然得到“第二个参数必须是处理 fn(req, res, next) 参数的函数。”错误:(我确保 var express = require('express') 在两个文件中......
  • 请在您的问题中发布更多代码。如果可以,请使用您发布的代码使问题可重复。

标签: node.js express subdomain


【解决方案1】:

express-subdomain 的作者 ?

我在上一期已经回答了这个问题 - 请参阅 https://github.com/bmullan91/express-subdomain/issues/4。我可能应该将其添加到自述文件中,因为仍有一些人使用 v3。

【讨论】:

    【解决方案2】:

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

    1. developerRoutes.js中,exports.developerRouteList = function(app)应该是module.exports = devRouter,并且应该在var devRouter = express.Router()之后。除非您在developerRoutes.js 中放置多个路由器,否则您不需要在module.exports 对象中创建一个名为developerRouteList 的子对象。此外,您似乎没有使用传递给 developerRoutes.jsapp 实例,因此应该可以更改它。
    2. main.js,现在你可以试试app.use(subdomain('test-developer', developerRoutes));

    【讨论】:

    • 谢谢!我认为这种语法只适用于 Express 4.x ......这个应用程序仍然是 Express 3.4。看起来我必须在子域工作发生之前迁移它。 (有趣!)
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多