【发布时间】: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.routeList是express.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') 在两个文件中......
-
请在您的问题中发布更多代码。如果可以,请使用您发布的代码使问题可重复。