重构npm请求方法代码

时间:2016-08-22 21:50:27

标签: javascript node.js request

目前正在使用npm请求,我想将我的代码重构为以下内容:

app.post('/work_order',function (req,res) {
  var work_order = req.body.work_order;
  var url = soapURI + work_order;
  reqMethod(url);
});

app.get('/work_order/:work_order', function (req, res) {
  var work_order = req.params.work_order;
  var url = soapURI + work_order;
  reqMethod(url);
});

function reqMethod (url){
  request({
    url: url,
    json: true
  }, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      // console.log(body); // Print the json response
      res.send(body);
    }
  });
}

问题是reqMethod现在是一个承诺,res.send(body)是其中的一部分。我不能简单return res.send(body)。我有两个重复的代码片段(每个代码都与方法完全相同)位于.get.post,所以我想将它们移到一个通用的,可重用的方法中。

问题:

  1. 我如何才能让它发挥作用?

  2. request是一个好的npm模块吗?你能否提出一些替代方案,也许还有更好的选择?

  3. 谢谢

2 个答案:

答案 0 :(得分:1)

您有2个选项。

选项1:将结果(res)参数传递给reqMethod:

app.post('/work_order',function (req,res) {
  var work_order = req.body.work_order;
  var url = soapURI + work_order;
  reqMethod(url, res);
});

app.get('/work_order/:work_order', function (req, res) {
  var work_order = req.params.work_order;
  var url = soapURI + work_order;
  reqMethod(url, res);
});
function reqMethod (url, res){
  request({
    url: url,
    json: true
  }, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      // console.log(body); // Print the json response
      res.send(body);
    }
    else {
      //send error here
    }
  });
}

选项2:向reqMethod添加回调

app.post('/work_order',function (req,res) {
  var work_order = req.body.work_order;
  var url = soapURI + work_order;
  reqMethod(url, function(err, body) {
    res.send(body)
  );
});

app.get('/work_order/:work_order', function (req, res) {
  var work_order = req.params.work_order;
  var url = soapURI + work_order;
  reqMethod(url, function(err, body) {
    res.send(body)
  );
});
function reqMethod (url, cb){
  request({
    url: url,
    json: true
  }, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      // console.log(body); // Print the json response
      cb(null, body);
    }
    else {
      cb(error)
    }
  });
}

答案 1 :(得分:1)

Express请求处理程序需要在其自己的作用域中使用res.send(),或者需要将所需的变量传递给您的帮助函数,以便可以在那里使用res

当使用promises作为Express请求处理(而不是回调)的基础时,使用Bluebird promise可以实现更简单的错误处理流程。

ES6 promises库提供了一个非常有用的标准Promise功能超集。自{4.}

以来,Needle一直是本机Node.js的一部分

Bluebird promisified执行到目前为止我所需要的所有HTTP,并且它比request重得多,轻得多。

代码

const Promise = require('bluebird');
const needle = Promise.promisifyAll(require('needle'));

function expressResponse (req, res, next, promisedResponse) {
  return promisedResponse
    .then( (result) => res.send(result) )
    .catch( next );
}

function reqMethod (url) {
  return needle
    .getAsync( url, {json: true} )
    .then( (response) => {
      if ( response.statusCode !== 200 )
        throw new Error('Status '+response.statusCode);
      return response.body;
    });
}

app.get('/work_order', function (req, res, next) {
  let work_order = req.body.work_order;
  let url = soapURI + work_order;
  expressResponse( req, res, next, reqMethod(url) );
});

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send(err.message)
})

expressResponse()使Express组件与任何响应生成代码分开,以防我想将这些函数用于express之外的其他函数。

reqMethod()会从Express error handling middleware needle.getAsync()返回一个承诺,该承诺会调用needle.get()并自动将回调转换为您的承诺。

已将next添加到Express请求处理程序方法签名中,并将其传递给expressResponse()。然后.catch(next)附加到promise链。这将允许Express处理承诺抛出的任何未捕获的异常。

使用next()错误处理需要添加{{3}}。您可以使Error知道更多,为不同的Error类生成不同的响应。

请注意,使用Promises,您现在可以在throw中的异步Promise中安全地reqMethod()正常异常,并且它们将由Express错误中间件处理。