Как установить Node.js с помощью NVM

2 месяца назад·2 мин. на чтение

Установка нескольких версий Node.js и управление ими с помощью nvm (Node Version Manager).

Иногда, исследуя GitHub, нужно клонировать репозитории, некоторые из которых требуют Node.js. Однако, не всегда требуемая версия Node.js совместима с той, которая установлена на нашем компьютере. В этом случае пришлось установить другую версию Node.js. NVM упрощает эту задачу и позволяет нам устанавливать и управлять несколькими версиями Node.js на вашем локальном компьютере.

Установка nvm на Ubuntu и Mac OS

Для установки nvm будем использовать сценарий установки из github-репозитория nvm-sh. На момент написания статьи актуальная версия установщика nvm была 0.39.7. Таким образом, вы можете использовать curl для загрузки, а затем запустить его с помощью bash:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
или с wget:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
После этого инсталлятор клонирует репозиторий nvm в каталог ~/.nvm/, следует добавить несколько строк ниже в конце файла ~/.bashrc для загрузки nvm.
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
Теперь вам нужно закрыть и снова открыть терминал для загрузки nvm, затем проверить версию:
nvm --version
# 0.39.7
Теперь nvm готов к использованию.

Использование nvm для управления версиями Node.js

Nvm имеет множество подкоманд, таких как install, use, uninstall и другие.

Установка версии Node.js

Во-первых, вы можете получить список доступных версий с помощью:
nvm list-remote

# или

nvm ls-remote
Вы можете установить конкретную версию с помощью nvm с помощью команды install.
nvm install 14.17.6
Если вы хотите установить LTS-версию, вы можете использовать --lts вместо номера версии.
nvm install --lts
Или вы можете установить последнюю версию, указав node вместо номера версии.
nvm install node

Загрузка определенной версии Node.js

Теперь вы устанавливаете некоторые версии Node.js на свой компьютер; Таким образом, вы можете увидеть список установленных версий с помощью list или ls.
nvm list

# или

nvm ls
Если вы хотите использовать определенную версию, используйте use. С помощью этой команды вы можете запустить Node.js по номеру версии или --lts.
nvm use <version>
Или используйте LTS-версию
nvm use --lts
Или используйте последнюю версию
nvm use node

Удаление Node.js версии

Наконец, если вы хотите удалить версию Node.js, вы можете использовать для этого команду uninstall. Во-первых, вам нужно переключиться на другую версию с use, после чего вы можете удалить ее.
nvm uninstall <version>

Что такое файл .nvmrc?

В проекте Node.js вы можете сохранить версию Node.js, совместимую с ней, в файле, который называется .nvmrc и вы должны создать его в корневом каталоге вашего проекта.
node --version > /path/to/project/.nvmrc
Затем вы можете использовать совместимую версию на других машинах ваших коллег по команде.
nvm use
# Found '/path/to/project/.nvmrc' with version <v14.17.6>
# Now using node v14.17.6 (npm v6.14.15)

Установка пакета на Node.js

Установка пакета на Node.js, установленным NVM, аналогична обычной установке node.js, но установка пакета основана на номере версии.
nvm use 14.17.5

npm install --global yarn

which yarn
# ~/.nvm/versions/node/v14.17.5/bin/yarn

Итоги

NVM помогает нам собрать несколько node.js версий на одной машине и использовать их в своем проекте или тестировать функции dev-версий без побочных эффектов для нашей системы или проекта.

Обработка ошибок в Express.js

2 года назад·4 мин. на чтение

Пишем middleware для Express.js для обработки ошибок.

Из-за неопределенного характера JavaScript существует множество способов выполнения одной задачи. Это может стать как достоинством, так и недостатком, особенно при работе в более крупной команде. Именно здесь в игру вступают процессы и руководящие принципы.

Предусловия

  • Установленный NodeJS
  • Знание NodeJS и Express.js
  • Знание того, как работает middleware в Express.js

Настройка проекта

Создадим базовое приложение Express.js с одним эндпоинтом. Этот эндпоинт (или ручка) будет методом POST, который принимает два входных параметра title и author.
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;

app.use(bodyParser.json());

app.post('/post', async (req, res) => {
  const { title, author } = req.body;

  if (!title || !author) {
    return res.status(400).json({
      status: 'error',
      message: 'Missing required fields: title or author'
    });
  }

  try {
    const post = await db.post.insert({ title, author });
    res.json(post);
  } catch (error) {
    return res.status(500).json({
      status: 'error',
      message: 'Internal Server Error'
    });
  }
});

app.listen(port, () =>
  console.log(`app is listening at http://localhost:${port}`)
);
Мы проверяем, существуют ли title и author, если нет, мы выбрасываем ошибку 400 и отправляем обратно JSON со статусом и сообщением. Если title и author существуют, приложение все равно будет аварийно завершать работу, потому что db не определена, и наш блок try/catch поймает его и отправит обратно ошибку 500 и JSON со статусом и сообщением. Со временем, по мере роста количества эндпоинтов и проверок, ввод res.status(4xx).json({ some: JSON }) каждый раз может быстро стать громоздким, а также создать большую избыточность кода. Почему бы не сделать что-то вроде throw new BadRequest('message')? Давайте посмотрим, как мы можем это реализовать.

Создание утилит для ошибок

Теперь создадим функции, которую мы можем использовать для генерации ошибок. Создадим новую папку /utils и файл errors.js.
// /utils/errors.js

class GeneralError extends Error {
  constructor(message) {
    super();
    this.message = message;
  }

  getCode() {
    if (this instanceof BadRequest) {
      return 400;
    } if (this instanceof NotFound) {
      return 404;
    }
    return 500;
  }
}

class BadRequest extends GeneralError { }
class NotFound extends GeneralError { }

module.exports = {
  GeneralError,
  BadRequest,
  NotFound
};
Этот файл определяет, какие ошибки мы можем выбросить в нашем приложении. Класс GeneralError расширяет Error и используется для получения наших сообщений и кодов состояния. Здесь у нас есть BadRequest и NotFound, которые расширяют GeneralError. Мы также указываем их коды ошибок в блоке getCode в GeneralError. Для простоты этой демонстрации у нас будут толькоBadRequest и NotFound. Если вы хотите добавить другие типы ошибок, все, что вам нужно сделать, это создать новый класс, который расширяет GeneralError и обновить его код состояния внутри блока getCode.

Создание middleware для обработки ошибок

Теперь мы сосредоточимся на реализации express middleware для обработки ошибок в нашем приложении. Создадим новый файл /middleware/handleErrors.js.
// /middleware/handleErrors.js

const { GeneralError } = require('../utils/errors');

const handleErrors = (err, req, res, next) => {
  if (err instanceof GeneralError) {
    return res.status(err.getCode()).json({
      status: 'error',
      message: err.message
    });
  }

  return res.status(500).json({
    status: 'error',
    message: err.message
  });
}


module.exports = handleErrors;
Примечание: middleware для обработки ошибок принимает 4 аргумента (ошибка в качестве первого аргумента), а не 3 аргумента для обычного middleware . Функция middleware handleErrors проверяет, является ли переданная ошибка экземпляром GeneralError. Если это так, мы возвращаем код состояния и тело JSON со статусом и сообщением.

Использование middleware для обработки ошибок

Давайте обновим наше приложение и эндпоинт, чтобы использовать наш недавно созданный middleware для обработки ошибок. Middleware для обработки ошибок должно быть помещено последним, после всех других middleware и маршрутов, чтобы оно функционировало должным образом.
const express = require('express');
const bodyParser = require('body-parser');
const handleErrors = require('./middleware/handleErrors');
const { BadRequest } = require('./utils/errors');

const app = express();
const port = 3000;

app.use(bodyParser.json());

app.post('/post', async (req, res, next) => {
  const { title, author } = req.body;
  
  try {
    if (!title || !author) {
      throw new BadRequest('Missing required fields: title or author');  // строка 16
    }
    const post = await db.post.insert({ title, author });
    res.json(post);
  } catch (err) {
    next(err)
  }
});

app.use(handleErrors); // строка 25

app.listen(port, () =>
  console.log(`app is listening at http://localhost:${port}`)
);
Во-первых, мы импортируем handleErrors и регистрируем его как middleware, как показано в строке 25. Мы также импортируем BadReqest и обновляем строку 16, чтобы выбросить новый BadRequest, если title и author отсутствуют. Наконец, мы добавляем next в качестве третьего аргумента в наш обработчик маршрута. Затем мы обновляем блок catch, чтобы передать ошибки в next чтобы наш обработчик ошибок мог обработать его.

Тестирование middleware для обработки ошибок

Для тестирования middleware используем Postman. Сначала мы делаем POST-запрос без body. Мы получаем ошибку 400 со статусом и сообщением в формате JSON.
{
  "status": "error",
  "message": "Missing required fields: title or author"
}
Теперь давайте сделаем еще один запрос POST и передадим title и author. На этот раз мы получаем ошибку 500 со статусом и сообщением в JSON.
{
  "status": "error",
  "message": "db is not defined"
}
Простое и чистое решение для обработки ошибок в приложении Express.js.

Итоги

В этой статье мы рассмотрели, как создать middleware для обработки ошибок для приложения Express.js. Это позволит поддерживать чистоту кода с меньшим количеством избыточного кода. Все, что нам нужно сделать, это выбросить ошибку и передать сообщение. Эта реализация добавляет гибкость для добавления дополнительных классов ошибок для вашего приложения по мере необходимости.