所以我有一个使用快速路由器和路由的节点应用程序,例如我有一个处理从数据库中获取公司对象的路由器,在公司路由器中,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()
});
});
现在,如果我在另一台路由器,请说评论路由器,我想要一家公司,我希望能够拨打这条路线,以便抓住该公司,而不必重复代码。
我该怎么做?
答案 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。