我如何推广Node.js中的http响应处理程序?

时间:2017-08-25 16:37:53

标签: javascript node.js rest express promise

我正在为节点应用程序编写一个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个几个参数。我认为这是一个更优雅的解决方案。

1 个答案:

答案 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)
}