Как установить Node.js с помощью NVM
2 месяца назад·2 мин. на чтение
Установка нескольких версий Node.js и управление ими с помощью nvm (Node Version Manager).
Иногда, исследуя GitHub, нужно клонировать репозитории, некоторые из которых требуют Node.js. Однако, не всегда требуемая версия Node.js совместима с той, которая установлена на нашем компьютере. В этом случае пришлось установить другую версию Node.js. NVM упрощает эту задачу и позволяет нам устанавливать и управлять несколькими версиями Node.js на вашем локальном компьютере.
Что такое файл
В проекте Node.js вы можете сохранить версию 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
:
После этого инсталлятор клонирует репозиторий nvm в каталогwget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
~/.nvm/
, следует добавить несколько строк ниже в конце файла ~/.bashrc
для загрузки nvm.
Теперь вам нужно закрыть и снова открыть терминал для загрузки 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 для управления версиями Node.js
Nvm имеет множество подкоманд, таких какinstall
, use
, uninstall
и другие.
Установка версии Node.js
Во-первых, вы можете получить список доступных версий с помощью:Вы можете установить конкретную версию с помощью nvm с помощью командыnvm list-remote # или nvm ls-remote
install
.
Если вы хотите установить LTS-версию, вы можете использоватьnvm install 14.17.6
--lts
вместо номера версии.
Или вы можете установить последнюю версию, указавnvm install --lts
node
вместо номера версии.
nvm install node
Загрузка определенной версии Node.js
Теперь вы устанавливаете некоторые версии Node.js на свой компьютер; Таким образом, вы можете увидеть список установленных версий с помощьюlist
или ls
.
Если вы хотите использовать определенную версию, используйтеnvm list # или nvm ls
use
. С помощью этой команды вы можете запустить Node.js по номеру версии или --lts
.
Или используйте LTS-версиюnvm use <version>
Или используйте последнюю версию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 для обработки ошибок принимает 4 аргумента (ошибка в качестве первого аргумента), а не 3 аргумента для обычного middleware . Функция middleware// /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;
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.
Теперь давайте сделаем еще один запрос POST и передадим{ "status": "error", "message": "Missing required fields: title or author" }
title
и author
. На этот раз мы получаем ошибку 500 со статусом и сообщением в JSON.
Простое и чистое решение для обработки ошибок в приложении Express.js.{ "status": "error", "message": "db is not defined" }