Вопрос:

Рефакторинг кода метода запроса npm

javascript node.js request

48 просмотра

2 ответа

180 Репутация автора

В настоящее время, используя запрос 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). У меня было 2 повторяющихся фрагмента кода (каждый из них в точности соответствует методу), .getи .postпоэтому я хочу переместить их в общий, многократно используемый метод.

Вопросов:

  1. Как я могу заставить это работать?

  2. Это requestхороший модуль npm? Можете ли вы предложить некоторые альтернативы, а может быть, и лучшие?

Спасибо

Автор: Pristine Kallio Источник Размещён: 22.08.2016 09:50

Ответы (2)


1 плюс

845 Репутация автора

Решение

У вас есть 2 варианта.

Вариант 1: передать параметр result (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)
    }
  });
}
Автор: RedJandal Размещён: 23.08.2016 03:02

1 плюс

35495 Репутация автора

Обработчик запросов Express должен использоваться res.send()в своей собственной области, или необходимые переменные должны передаваться в вашу вспомогательную функцию, чтобы их resможно было использовать там.

Использование обещаний позволяет упростить обработку ошибок, когда они используются в качестве основы для экспресс-обработки запросов (вместо обратных вызовов).

Библиотека обещаний Bluebird предоставляет очень полезный расширенный набор стандартных функций Promise. Обещания ES6 были частью родного Node.js с 4.x

Needle выполняет все, что мне нужно, 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 отделяются от кода генерации ответов на случай, если я захочу использовать эти функции для чего-то другого, кроме экспресс.

reqMethod()возвращает обещание от обещанного Bluebird, needle.getAsync() который вызывает needle.get()и автоматически преобразует обратный вызов в обещание для вас.

К nextподписи метода обработчика экспресс-запроса был добавлен знак A, который также передается expressResponse(). Затем .catch(next)прикрепляется к цепочке обещаний. Это позволит Express обрабатывать любые необработанные исключения, выданные обещанием.

Использование next()обработки ошибок требует добавления промежуточного программного обеспечения для обработки ошибок Express . Вы можете сделать это намного более Errorосознанным, получая разные ответы для разных Errorклассов.

Обратите внимание, что с Promises теперь вы можете throwбезопасно выполнять обычные исключения в асинхронном Promise, например, в in, reqMethod()и они будут обрабатываться промежуточным программным обеспечением ошибок Express.

Автор: Matt Размещён: 23.08.2016 03:35
Вопросы из категории :
32x32