如何使用快速路由器路由进行双重用途?

时间:2016-09-29 19:48:58

标签: node.js express

所以我有一个使用快速路由器和路由的节点应用程序,例如我有一个处理从数据库中获取公司对象的路由器,在公司路由器中,get方法如下所示:

router.get('/:id', function(req, res, next) {
    var id = req.params.id;
    models.Company.get(Number(id), function(err, entity) {
        if (err) {
            console.error("Get error:", err);
        }
        console.log('Got entity:', entity);
        req.data = entity;
        next()
    });
});

现在,如果我在另一台路由器,请说评论路由器,我想要一家公司,我希望能够拨打这条路线,以便抓住该公司,而不必重复代码。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

如果你真的想使用相同的处理程序,你可以使用命名函数:

function yourHandler(req, res, next) {
    var id = req.params.id;
    models.Company.get(Number(id), function(err, entity) {
        if (err) {
            console.error("Get error:", err);
        }
        console.log('Got entity:', entity);
        req.data = entity;
        next()
    });
}
router.get('/:id', yourHandler);
router2.get('/companies/:id', yourHandler);

或者你可以通过创建一个回调函数来抽象出实际的数据库查找:

function getCompany(id, callback) {
    models.Company.get(Number(id), function(err, entity) {
        if (err) {
            console.error("Get error:", err);
            callback(err);
        } else {
            console.log('Got entity:', entity);
            callback(null, entity);
        }
    });
}

或返回promise的函数:

function getCompany(id) {
    return new Promise(function (resolve, reject) {
        models.Company.get(Number(id), function(err, entity) {
            if (err) {
                console.error("Get error:", err);
                reject(err);
            } else {
                console.log('Got entity:', entity);
                resolve(entity);
            }
        });
    });
}

不同之处在于您使用这样的回调版本:

getCompany(123, function (err, data) {
  if (err) {
    // handle error
  } else {
    // you have data
  }
});

并使用承诺返回版本,如下所示:

getCompany(123)
.then(function (data) {      
  // you have data
})
.catch(function (err) {
  // handle error
});

使用async模块可以轻松编写回调版本,并且使用bluebird模块或其他一些promise框架可以轻松编写promise版本。参见:

值得一提的是Bluebird比原生ES6承诺要快得多,详见this answer