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

В этой статье мы рассмотрим некоторые решения распространенных проблем при написании приложений Node.

Зарегистрируйте модели Mongoose

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

Например, в models/User.js можно записать следующее:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
  name: String
});

mongoose.model('User', userSchema);

Затем в нашем app.js файле мы можем написать:

mongoose.connect("mongodb://localhost/news");
require("./models/User");
const users = require('./routes/users');
const app = express();

Требование ./models/User.js заставит его запустить код для регистрации модели.

Catch Express body-parser Error

Мы можем отлавливать body-parser ошибки Express с помощью нашего собственного промежуточного программного обеспечения.

Например, мы можем написать:

app.use( (error, req, res, next) => {
  if (error instanceof SyntaxError) {
    sendError(res, 'syntax error');
  } else {
    next();
  }
});

Мы можем проверить, является ли error экземпляром SyntaxError, и что-то с ним сделать.

В противном случае мы вызываем next, чтобы перейти к следующему промежуточному программному обеспечению.

Направлять все запросы в index.html в приложении Express

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

Например, мы можем написать:

const express = require('express')
const server = express();
const path = require('path');
server.use('/public', express.static(path.join(__dirname, '/assets')));
server.get('/foo', (req, res) => {
  res.send('ok')
})
server.get('/*', (req, res) => {
  res.sendFile(path.join(__dirname, '/index.html'));
})
const port = 8000;
server.listen(port)

Мы перенаправляем все запросы на index.html с общим маршрутом в конце.

Таким образом, у нас все еще могут быть маршруты, которые делают что-то еще.

Маршрут foo отвечает ok.

express.static обслуживает статический контент.

Базовый веб-сервер с Node.js и Express для обслуживания файлов и ресурсов HTML

Мы можем использовать промежуточное ПО express.static для обслуживания статических ресурсов.

Например, мы можем написать:

const express = require('express');
const app = express();
const http = require('http');
const path= require('path');
const httpServer = http.Server(app);
app.use(express.static(path.join(__dirname, '/assets'));
app.get('/', (req, res) => {
  res.sendfile(path.join(__dirname, '/index.html'));
});
app.listen(3000);

Мы создаем сервер с express.static промежуточным программным обеспечением для обслуживания статических файлов из папки assets.

Затем мы создаем маршрут GET для рендеринга index.html.

Мы также можем использовать connect, чтобы сделать то же самое:

const util = require('util');
const connect = require('connect');
const port = 1234;
connect.createServer(connect.static(__dirname)).listen(port);

Мы вызываем createServer, чтобы создать веб-сервер.

Затем мы используем connect.static для обслуживания текущей папки приложения как статической папки.

Статический контент Gzip с помощью Express

Мы можем использовать промежуточное ПО compression для обслуживания статического контента с помощью Gzip.

Например, мы можем написать:

const express = require('express');
const compress = require('compression');
const app = express();
app.use(compress());

Найдите размер файла в Node.js

Мы можем использовать метод statSync, чтобы получить размер файла.

Например, мы можем написать:

const fs = require("fs");
const stats = fs.statSync("foo.txt");
const fileSizeInBytes = stats.size

Мы вызываем statSync, чтобы вернуть объект с некоторыми данными о файле.

Размер в байтах находится в свойстве size.

Автоматически добавлять заголовок в каждый ответ «рендеринга»

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

Например, мы можем написать:

app.get('/*', (req, res, next) => {
  res.header('X-XSS-Protection', 0);
  next(); 
});

для создания промежуточного программного обеспечения для установки заголовка X-XSS-Protection в 0.

Обновите дочернюю коллекцию с помощью Mongoose

Мы получаем обновленную коллекцию после обновления в обратном вызове.

Например, мы можем написать:

Lists.findById(listId, (err, list) => {
  if (err) {
    ...
  } else {
    list.items.push(task)
    list.save((err, list) => {
      ...
    });
  }
});

Мы позвонили findById, чтобы получить коллекцию.

Затем мы вызываем push в items дочернюю коллекцию.

Наконец, мы вызываем list.save, чтобы сохранить данные и получить последний список в массиве list обратного вызова save.

Кроме того, мы можем использовать оператор $push для выполнения push за пределами обратного вызова:

Lists.findByIdAndUpdate(listId, {$push: { items: task }}, (err, list) => {
  //...
});

Мы вызываем findByIdAndUpdate с listId, чтобы получить список.

Затем мы устанавливаем items с нашим объектом task и используем $push, чтобы протолкнуть его.

Затем мы получаем последние данные из параметра list в обратном вызове.

Заключение

Мы можем зарегистрировать модели Mongoose, запустив код для регистрации схемы.

Добавить элемент в дочернюю коллекцию можно несколькими способами.

Мы можем обслуживать статические файлы с помощью Express или Connect.

Мы можем отлавливать ошибки парсера тела.