Как и в случае с любыми другими приложениями, при написании приложений 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.
Мы можем отлавливать ошибки парсера тела.