3

我正在使用 node.js 和 Express 设计一个应用程序,我想知道是否可以将某些路由逻辑移出 app.js 文件。例如,我的 app.js 当前包含:

app.get('/groups',routes.groups);
app.get('/',routes.index);

有没有办法将此逻辑移出 app.js 文件,并且只有以下内容:

app.get('/:url',routes.get);
app.post('/:url",routes.post);

这样所有GET请求都将由 ? 处理routes.get,所有POST请求都由routes.post?

4

2 回答 2

5

您可以将正则表达式作为路由定义传递:

app.get(/.+/, someFunction);

这将匹配任何东西。但是,如果您只是想将路由定义移到主 app.js 文件之外,那么执行以下操作会更清晰:

应用程序.js

var app = require('express').createServer();

...

require('routes').addRoutes(app);

路由.js

exports.addRoutes = function(app) {
    app.get('/groups', function(req, res) {
        ...
    });
};

这样,您仍然使用 Express 的内置路由,而不是重新滚动您自己的路由(就像您在示例中必须做的那样)。

于 2012-07-15T17:10:38.210 回答
0

完整披露:我是下面提到的节点模块的开发人员。

有一个节点模块可以满足您的要求(并且最终会做更多)。它为 express 提供基于约定优于配置的自动路由。模块名称是 honey-express,但目前处于 alpha 开发阶段,尚未在 NPM 上可用(但您可以从https://github.com/jaylach/honey-express的源代码中获取它。

一个简短的例子说明它是如何工作的:(请注意这个咖啡脚本)

# Inside your testController.coffee file. Should live inside /app/controllers
honey = require 'honey-express'

TestController = new honey.Controller
    index: ->
        # @view() is a helper method to automatically render the view for the action you're executing. 
        # As long as a view (with an extension that matches your setup view engine) lives at /app/views/controller/actionName (without method, so index and not getIndex), it will be rendered.
        @view()
    postTest: (data) ->
        # Do something with data

现在,在您的 app.js 文件中,您只需要设置一些简单的配置:

# in your app.configure callback...
honey.config 'app root', __dirname + '/app'
app.use honey.router()

现在,只要有请求进来,honey 就会自动寻找具有指定路由的控制器,然后寻找匹配的动作.. 例如 -

  • /test 会自动路由到 testController 的 index/getIndex() 方法
  • / 会自动路由到 homeController 的 index/getIndex() 方法(默认控制器是 home),如果存在的话
  • 如果 http 方法是 POST,/test/test 会自动路由到 testController 的 postTest() 方法。

正如我所提到的,该模块目前处于 alpha 状态,但自动路由工作得很好,并且现在已经在两个不同的项目上进行了测试 :) 但是由于它处于 alpha 开发阶段,因此缺少文档。如果你决定走这条路,你可以查看我在 github 上的示例,查看代码,或者联系我,我很乐意提供帮助 :)

编辑:我还应该注意,honey-express 确实需要最新(BETA)版本的 express,因为它使用了 express 2.x 中不存在的功能。

于 2012-07-15T17:14:48.980 回答