Node.js - популярная среда выполнения для написания приложений на JavaScript. Чтобы упростить их обслуживание, мы должны установить некоторые правила, которым люди должны следовать.

В этой статье мы рассмотрим, как документировать API и корректно завершать процессы.

Документируйте ошибки API с помощью GraphQL

Мы можем создать наш API, используя библиотеки GraphQL. Это дает нам «песочницу» для запроса данных. Он также обеспечивает строгую типизацию и возвращает только то, что мы хотим.

Он также предоставляет схему и комментарии, чтобы мы могли документировать наши API без добавления дополнительной документации.

Чтобы создать GraphQL API, мы можем использовать пакеты graphql и express-graphql для создания GraphQL API. Устанавливаем, запустив:

npm i express-graphql graphql

Затем мы можем создать простой GraphQL API, написав:

const express = require('express');
const bodyParser = require('body-parser');
const graphqlHTTP = require('express-graphql');
const { buildSchema } = require('graphql');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const schema = buildSchema(`
  type Query {
    quoteOfTheDay: String
  }
`);
const root = {
  quoteOfTheDay: () => {
    return 'hello';
  },
};
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}));
app.listen(3000, () => console.log('server started'));

После этого мы сможем перейти к /graphql и протестировать наш quotwOfTheDay запрос. Автозаполнение должно быть доступно из-за строгой типизации.

Изящно завершите процесс при возникновении неизвестной ошибки

Когда возникает неизвестная ошибка, мы должны выйти из процесса, так как мы не знаем, почему он дает сбой. Обычной практикой является перезапуск процесса с помощью инструмента управления процессами, такого как Forever или PM2.

Продолжать запускать приложение в неисправном состоянии - плохая идея.

Используйте зрелый регистратор для повышения видимости ошибок

Чтобы упростить обнаружение ошибок, мы можем использовать регистратор, такой как Winston, Bunyan, Log4js или Pino, для регистрации действий, которые произошли в нашем приложении. Например, мы можем использовать Winston с пакетом express-winston, чтобы добавить ведение журнала в приложение Express следующим образом:

const express = require('express');
const bodyParser = require('body-parser');
const winston = require('winston');
const expressWinston = require('express-winston');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressWinston.logger({
  transports: [
    new winston.transports.Console()
  ],
  format: winston.format.combine(
    winston.format.colorize(),
    winston.format.json()
  ),
  meta: true,
  msg: "HTTP {{req.method}} {{req.url}}",
  expressFormat: true,
  colorize: false,
  ignoreRoute: function (req, res) { return false; }
}));
app.get('/', (req, res, next) => {
  res.send('hello')
});
app.get('/foo', (req, res, next) => {
  try {
    throw new Error('error')
    res.send('hello')
  } catch (err) {
    next(err)
  }
});
app.use((err, req, res, next) => {
  res.send('error occurred')
})
app.listen(3000, () => console.log('server started'));

Мы просто добавили регистратор прямо в наше приложение с помощью функции expressWinston.logger.

Потоки ошибок тестирования с использованием нашей любимой среды тестирования

Использование ручного тестирования является медленным и подверженным ошибкам. Поэтому мы должны добавить в наше приложение автоматические тесты. Это позволяет нам проверять как положительные, так и ошибочные сценарии, запустив код, который выполняется за секунды.

Существует множество тестовых фреймворков, таких как Mocha, Chai и Jest, которые могут сделать это за нас.

Обнаружение ошибок и простоев с помощью продуктов APM

Мы можем использовать продукты для мониторинга простоев и производительности, чтобы отслеживать состояние нашего приложения.

Для приложений Express мы можем добавить пакет express-status-monitor, чтобы отслеживать состояние нашего приложения, включая использование ЦП и памяти, время отклика, количество запросов в секунду и многое другое.

Нам просто нужно установить пакет, запустив:

npm i express-status-monitor

Затем мы можем использовать его, написав следующий код:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(require('express-status-monitor')());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res, next) => {
  res.send('hello')
});
app.listen(3000, () => console.log('server started'));

Мы просто помещаем пакет прямо в наше приложение с app.use(require(‘express-status-monitor’)());.

Затем, когда мы перейдем на страницу /status, мы увидим все перечисленные показатели производительности и состояния.

Перехват необработанных отклонений обещаний и событий ошибок

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

Мы также должны подписаться на process.unhandledRejection для обработки ошибок. Например, если мы попытаемся получить доступ к несуществующему файлу и потерпят неудачу, мы должны написать что-нибудь:

const fs = require('fs')
const stream = fs.createReadStream('does-not-exist')
process.on('unhandledRejection', (reason, promise) => {
  console.log(`Unhandled Rejection at: ${reason.stack || reason}`)
})

Затем мы обрабатываем ошибку, возникающую при попытке доступа к файлу, который не найден, без сбоя приложения.

Чтобы отловить ошибки отклоненных обещаний, мы пишем:

Promise.reject('error')
.catch(err=> console.log(err))

or:

(async()=>{
  try {
    await Promise.reject('error')
  }
  catch(ex){
    console.log(ex);
  }
})();

Заключение

Мы должны вылавливать ошибки в нашем коде и аккуратно их обрабатывать. Кроме того, мы должны регистрировать действия в нашем приложении с помощью регистраторов и следить за работоспособностью и производительностью нашего приложения с помощью инструмента мониторинга. Документация по нашему приложению также очень важна.