32

我正在使用 Express 在 node.js 中编写一个 Web 应用程序。我已经定义了如下路线:

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

如何从快递中重用该路线?

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

我在 API 文档中找不到任何东西,我宁愿不使用像“request”这样的另一个库,因为这看起来很笨拙。我试图让我的应用程序尽可能模块化。想法?

谢谢

4

5 回答 5

26

与盖茨所说的类似,但我会将其保留function(req, res){}在您的路线文件中。所以我会做这样的事情:

路由.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);
});

然后在您的模块中将您的逻辑拆分如下:

我的模块.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;
于 2012-10-05T04:13:37.623 回答
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()声明,这些回调处理程序位于不同的、组织更好的文件中。

于 2012-10-04T23:33:36.913 回答
3

如果你的路由上有很多中间件,你可以从传播中受益:

const router = express.Router();

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

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );
于 2016-11-14T12:08:56.750 回答
1

您可以run-middleware完全使用模块

app.runMiddleware('/firstService/query',function(responseCode,body,headers){
     // Your code here
})

更多信息:

披露:我是这个模块的维护者和第一个开发者。

于 2016-09-14T13:15:45.403 回答
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');
    }); });

希望这会有所帮助。

于 2017-06-17T09:19:08.447 回答