在Express NodeJS中,如何调用已定义的路由?

32

我正在使用Express编写Node.js网络应用程序。我定义了如下路由:

app.get("/firstService/:query", function(req,res){
    //trivial example
    var html = "<html><body></body></html>"; 
    res.end(html)
});

我该如何在express中重复使用这个路由?

app.get("/secondService/:query", function(req,res){
    var data = app.call("/firstService/"+query);
    //do something with the data
    res.end(data);
});

我在API文档中找不到任何信息,而且也不想使用像"request"这样的其他库,因为那似乎有些笨拙。 我试图尽可能地使我的应用程序模块化,你有什么想法吗?

谢谢


这个回答解决了你的问题吗?从NodeJS内部调用Express路由 - abernier
5个回答

26

与盖茨所说的类似,但我会在你的路由文件中保留function(req, res){}。 因此,我会像这样做:

routes.js

var myModule = require('myModule');

app.get("/firstService/:query", function(req,res){
    var html = myModule.firstService(req.params.query);
    res.end(html)
});

app.get("/secondService/:query", function(req,res){
    var data = myModule.secondService(req.params.query);
    res.end(data);
});

然后在你的模块中,按以下方式拆分逻辑:

myModule.js

var MyModule = function() {
    var firstService= function(queryParam) {
        var html = "<html><body></body></html>"; 
        return html;
    }

    var secondService= function(queryParam) {
        var data = firstService(queryParam);
        // do something with the data
        return data;
    }

    return {
        firstService: firstService
       ,secondService: secondService
    }
}();

module.exports = MyModule;

16

你能否将这个功能简单地拆分到另一个函数中,将其放在共享的位置,然后从那里开始进行?

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res);

app.get('/firstService/:query', queryHandler.firstService);

// second app
app.get('/secondService/:query', queryHandler.secondService);

说实话,在app.get(...)中嵌套回调的整个过程并不是一个很好的做法。你最终会得到一个包含所有核心代码的巨大文件。

你真正想要的是一个充满了app.get()app.post()语句的文件,所有的回调处理程序都存放在不同的、更好组织的文件中。


1
谢谢!我只是一个 Express 初学者,正在努力掌握一个变得难以控制的项目。有没有中级到高级的 Express 教程/帮助网站可以推荐? - user1148710

3

如果您在路由上有很多中间件,那么可以从分散中受益:

const router = express.Router();

const myMiddleware = [
    authenticationMiddleware(),
    validityCheckMiddleware(),
    myActualRequestHandler
];

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );

2
根据 http://expressjs.com/en/guide/routing.html 的例子:app.get('/example/c', [cb0, cb1, cb2]),看起来甚至不需要使用扩展运算符。无论如何都很好知道! - ryanm
@ryanm 哦,好的发现! - Oliver Salzburg

2
你可以使用run-middleware模块来实现这一点。
app.runMiddleware('/firstService/query',function(responseCode,body,headers){
     // Your code here
})

更多信息:

声明:我是这个模块的维护者和第一位开发者。


这个能和路由器一起使用吗?如果可以,那么与所示示例有何不同?谢谢! - Shaun
Morgan正在显示错误的路由信息,该路由是通过run-middleware调用的。@aminadav能提供帮助吗? - Jayadratha Mondal

1
我已经使用以下方法: 在userpage.js文件中。
router.createSitemap = function(req, res, callback) {  code here callback(value);  }

在 product.js 文件中。
var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function () {
                            //console.log('sitemap');
                        });

也可以在同一个userpage.js路由器中使用,我还可以用于其他路由。例如:
router.get('/sitemap', function (req, res, next) {
    router.createSitemap(req, res, function () {
        res.redirect('/sitemap.xml');
    }); });

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接