我正在为节点应用程序编写一个rest api,我发现自己重写了以下内容:
function(req, res, next) {
databaseCall()
.then( (results) => {
if (results != null) {
res.status(200).send(results);
} else {
res.sendStatus(404);
}
})
.catch(function(err) {
console.log("Request error: " + err.stack);
res.sendStatus(500);
})
}
我想重构响应部分,所以我可以做类似
的事情databaseCall()
.then(handleResponse)
其中handleResponse
将处理整个响应/捕获过程。
但我无法弄清楚如何做到这一点。 databaseCall方法因端点而异 - 有时需要参数,有时则不需要。我可以创建一个泛型函数表达式,它接受databaseCall结果并将其粘贴在promise链中,但我不知道如何访问该函数内的响应对象。我知道我可以添加另一个函数来组合所有内容,如下所示:
function(databaseCall, parameter, req, res, next) {
databaseCall(parameter)
.then( (results) => {
if (results != null) {
res.status(200).send(results);
} else {
res.sendStatus(404);
}
})
.catch( (err) => {
console.log("Request error: " + err.stack);
res.sendStatus(500);
})
}
但这看起来很难看,因为databaseCall可能有0个几个参数。我认为这是一个更优雅的解决方案。
答案 0 :(得分:0)
您可能正在考虑正确的方向,您只需要更进一步,将db调用保留在通用处理程序之外,并将其作为承诺传递
// generic handler for db promise
// the promise is created outside and passed as arg
function responseFromDb(databaseCallPromise, res) {
databaseCallPromise
.then((results) => {
if (results != null) {
res.status(200).send(results);
} else {
res.sendStatus(404);
}
})
.catch((err) => {
console.log(`Request error: ${err.stack}`);
res.sendStatus(500);
});
}
// handler per request, only needs to create db call with the desired params
// and pass it to the generic handler, which will take care of sending the response
function(req, res, next) {
responseFromDb(databaseCall(param1, param2), res)
}