Всем привет,

Я провел тест кода на очистку кода Nodejs/Express и понял, что не совсем понимаю, как работает Nodejs/Express и какие новейшие стили написания используют синтаксис ES6/7. Итак, здесь я хочу сделать краткий обзор того, что я сделал и чему научился.

Экспресс для чего?

Nodejs — это только среда выполнения, как и Java и Python, для реализации веб-запросов HTTP необходимо использовать платформу Express для выполнения операций CURD.

Особенности Экспресс?

Короче говоря, Express — это серия вызовов промежуточного программного обеспечения. то есть ПОЛУЧИТЬ что-то из API

localhost:3000/api/delivery/au?id=5

промежуточная функция выглядит следующим образом:

app.get('/:id', function(res,req,next) {
  const region = req.params.region;
  const id = req.query.id; // get data from request URL
  console.log("region:" + " " + region);
  next(); //pass to the next middleware
  }, function(res,req,next) {
    res.json({
      region:region,
      id:id
    });
  } // send request data
);

Дополнительные сведения об операциях промежуточного программного обеспечения см. на веб-сайте Expressjs.

Экспресс ВС. другие фреймворки (например, Koa)

Express — не единственный фреймворк для управления HTTP-запросами, Koa также является фреймворком для этого, и я видел в некоторых статьях, что по сравнению с Express это

  • более легкий
  • может создавать надежные приложения
  • поддерживать больше синтаксиса ES6/7

но я никогда не использовал это, поэтому я просто оставлю это для будущей проверки :)

Держите свое приложение Node в ногу со временем! (ES6/7)

На самом деле, я только начал знакомиться с Nodejs около полугода назад, поэтому я никогда не использовал обратные вызовы в приложении Node, но в тесте кода есть обратные вызовы, поэтому мне нужно знать, как это работает, а затем изменить их на обещания.

Функция обратного вызова VS Promise

Оба они используются для асинхронного программирования.

…К сожалению, необработанные обратные вызовы жертвуют потоком управления, обработкой исключений и семантикой функций, с которой мы знакомы в синхронном коде. Обещания дают возможность вернуть эти вещи…

Я так понимаю: Promise дает возможность использовать асинхронный код в другом месте, вам не нужно передавать его во вложенную функцию, вы можете просто сослаться на объект Promise. Вот пример использования обратного вызова:

т. е. Следующий фрагмент кода показывает, что обратный вызов передается в функцию asyncExample, а переменная данных вычисляется, а затем сохраняется в функции обратного вызова для последующего использования. В функции useAsyncExample данные используются для добавления в результирующий массив.

function asyncExample (callback){
  let data = 1;
  data++;
  callback(data);
}
...
function useAsyncExample (callback) {
  let result = [];
  asyncExample(function(data) {
    result.push(data);
  });
}

Для меня использование обратных вызовов здесь требует немного логики, поскольку у обратного вызова нет имени, поэтому, если обратные вызовы передаются во вложенных функциях, мне нужно найти начальное местоположение обратного вызова, а затем организовать логику вызова, что раздражает!

Если мы используем обещание, все может быть проще. Вот пример обещания:

function asyncExamplePromiseVersion () {
  let data = 1;
  // do sth with data
  return new Promise((resolve, reject) => {
     //error handling   
     if (data !== 5 ) {
        reject();
     }
     else resolve(data);
}
async function useAsyncPromise () {
  const result = asyncExamplePromiseVersion();
  await result.then(data => console.log(data));
}

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

Обещание может иметь только две возможности (разрешить или отклонить) после завершения обработки. и функция .then разворачивает то, что происходит в промисе (чтобы увидеть, были ли данные обработаны должным образом).

Подводя итог, обещание имеет преимущества перед обратными вызовами.

  • вы можете дать обещание имя (семантика функции)
  • Обещание, естественно встроенный механизм обработки ошибок (Reject)
  • Обещание не должно быть вложенным (поток управления)

const, пусть VS var

var предназначен для глобального использования, а let находится в пределах области действия функции. const предназначен для неизменности. Если говорить о преимуществах неизменяемости, это будет долгая история, поэтому я просто придерживаюсь вывода: избегайте var, используйте const и let.

Продолжение следует…

Я также хочу добавить обработку ошибок и части Tests(Mocha/Chai) в следующих статьях, пока что все!