【问题标题】:Node/Express: Route identifiers for root '/' routeNode/Express:根“/”路由的路由标识符
【发布时间】:2013-11-27 07:06:15
【问题描述】:

我正在开发一个目录应用程序,其中内容根据某些参数在服务器端呈现。我的目录是在 appache 上运行的其他应用程序的子应用程序。我在需要时使用反向代理重定向到节点。

所以,我的节点根路由是这样的:http://myapp.com/directory/

我需要这种格式的路由:http://maypp.com/directory/location/category

在哪里, 位置和类别可以是任何东西! (这是用户生成的内容)

我最初的想法是我可以做这样的事情:

app.get('/:location?/:category?', routes.index);

但是,我得到以下行为: 在我的routes.index 渲染视图之后 console.log('location: ' + req.params.location + ', category: ' + req.params.category);

当我导航到 http://maypp.com/directory/ 时,我得到以下信息:

location: css, category: main.css
GET /components/modernizr/modernizr.js 200 69ms - 48.97kb
GET /components/requirejs/require.js 200 69ms - 80.75kb

浏览器输出中断并出现以下错误:

Uncaught SyntaxError: Unexpected token < main.js:1

最奇怪的是 main.js 包含渲染的 HTML 页面,而不是我的浏览器端 js 模块。

另一个测试用例: 当我导航到 http://maypp.com/directory/loc/cat 时,我得到以下信息:

location: loc, category: cat
location: css, category: main.css
GET /components/modernizr/modernizr.js 200 6ms - 48.97kb
GET /components/requirejs/require.js 200 6ms - 80.75kb
location: js, category: main.js

在浏览器方面与上述相同。

在我的layout.jade 我有以下内容:

script(type="text/javascript", src="/directory/components/requirejs/require.js" data-main="/directory/js/main")

如果我在没有第二个标识符的情况下定义了我的路线(例如 app.get('/:location?', routes.index);),它可以正常工作,但这不是我需要的!

======回答=========
将所有路由处理移至静态资产处理中间件下方。

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');
app.set('view options', {layout: true});
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.responseTime());
app.use(express.errorHandler());
app.use(express.responseTime());
app.use(require('prerender-node'));

app.use(express.static(path.join(__dirname, '../../public')));
app.use(app.router);

var routes = require('./routes')(app);

【问题讨论】:

    标签: javascript node.js express routes requirejs


    【解决方案1】:

    位置:css,类别:main.css

    这和您的一些错误是因为您的静态内容、css 和 js 处理程序未设置为在 app.router 之前执行。 express 中的中间件排序必须经过深思熟虑和精确。所以首先让你的中间件顺序正确,这样你所有的静态 CS、JS、图像等都在 app.router 之前处理。

    【讨论】:

    • 你是对的!非常感谢!由于我组织路线的方式,我有以下var routes = require('./routes')(app);,这是在静态资产处理之前调用的。我只是把它移下来了,所以它在 app.router 之后!现在它正在工作。
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 2022-01-04
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2020-03-26
    相关资源
    最近更新 更多