увеличить лимит экспресс почты после прокси api - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть отдельный интерфейс и бэкэнд, где все запросы к http://frontend.com/api передаются на бэкэнд. Однако мы разрешаем загрузку изображений максимум до 10 МБ, что ограничено внутренним пределом экспресса 1 МБ для всех тел запросов.

У меня есть следующий конфиг:

const express = require('express');
const consola = require('consola');
const { Nuxt, Builder } = require('nuxt');
const helmet = require('helmet');

// Express
const app = express();
const host = process.env.HOST || '127.0.0.1';
const port = process.env.PORT || 8080;

app.set('port', port);

// Import and Set Nuxt.js options
const config = require('../nuxt.config.js');

config.dev = !(process.env.NODE_ENV === 'production');

async function start() {
  // Init Nuxt.js
  const nuxt = new Nuxt(config);

  if (config.dev) {
    const builder = new Builder(nuxt);
    await builder.build();
  }

  // NOTE: Only in production mode
  if (!config.dev) {
    // Helmet default security + Referrer + Features
    app.use(helmet());
  }

  // Proxy /api to proper backend
  app.use('/api', proxy(process.env.API_ENDPOINT || 'http://localhost:3000'));

  // Give nuxt middleware to express
  app.use(nuxt.render);

  // Listen the server
  app.listen(port, host);
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true,
  });
}
start();

Я пытался добавить body-parser, пока не обнаружил, что это работает только для запросов не multipart / form. Учитывая, что это не экспресс-бэкэнд, а используется только для обслуживания SSR (с nuxt), я понятия не имею, как заставить это работать с чем-то вроде multer или busboy.

Можно ли это сделать без настройки nginx в качестве обратного прокси-сервера?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Сам по себе Express не накладывает никаких ограничений на размер тела, потому что вообще не обрабатывает тело запроса.

Однако некоторые промежуточные программы делают накладывают ограничение, например body-parser и express-http-proxy, которое вы используете.

Чтобы увеличить лимит до 10 МБ:

app.use('/api', proxy(process.env.API_ENDPOINT || 'http://localhost:3000', {
  limit: '10mb'
));
0 голосов
/ 08 ноября 2018

Мой метод работает так: я определяю свой базовый URL api в файле конфигурации, на который я ссылаюсь в файле api / init.js. Этот файл добавляется в плагины в nuxt.config.js. Это тот файл:

import axios from 'axios'
import {baseURL} from '~/config'
import cookies from 'js-cookie'
import {setAuthToken, resetAuthToken} from '~/utils/auth'
import { setUser, setCart } from '../utils/auth'

axios.defaults.baseURL = baseURL

const token = cookies.get('x-access-token')
const currentUser = cookies.get('userDetails')
const currentCart = cookies.get('userCart')

if (token) {
    setAuthToken(token)
    setUser(currentUser)
    setCart(currentCart)
} else {
    resetAuthToken()
}

Бэкэнд работает на своем собственном сервере, который я запускаю с node index.js, и это базовый URL, который ищет мой init.js. Бэкэнд index.js выглядит так:

const mysql = require('mysql')
const express = require('express')
const bodyParser = require('body-parser')
const config = require('./config')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const multer = require('multer')
const auth = require('./auth')
const files = require('./files')
const create = require('./create')
const get = require('./get')
const delet = require('./delet')
const blogFiles = require('./blogFiles')

const db = mysql.createConnection(config.db)
const app = express()

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
  extended: true
}))

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*')
    res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS')
    res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, x-access-token, userDetails, userCart')
    if (req.method === 'OPTIONS') {
      res.sendStatus(200)
    }
    else {
      next()
    }
})

app.use((err, req, res, next) => {
  if (err.code === 'LIMIT_FILE_TYPES') {
      res.status(422).json({ error: 'Only images are allowed'})
      return
  }
  if (err.code === 'LIMIT_FILE_SIZE') {
      res.status(422).json({ error: `Too Large. Max filesize is ${MAX_SIZE/1000}kb` })
      return
  }
})

app.use('/auth', auth({db, express, bcrypt, jwt, jwtToken: config.jwtToken}))
app.use('/files', files({db, express, multer}))
app.use('/blogFiles', blogFiles({db, express, multer}))
app.use('/create', create({db, express}))
app.use('/get', get({db, express}))
app.use('/delet', delet({db, express}))

app.get('/test', (req, res) => {
  db.query('select 1+1', (error, results) => {
    if (error) {
      return res.status(500).json({type: 'error', error})
    }
    res.json({type: 'success', message: 'Test OK', results})
  })
})

app.listen(config.port)
console.log('App is running on port ' + config.port)

Files.js обрабатывает загрузку файлов, и, как вы можете видеть, index.js требует этого. Именно там я использую multer для обработки лимита загрузки и тому подобное. Это файл .js

module.exports = ({db, express, multer }) => {
    const routes = express.Router()

    const fileFilter = function(req, file, cb) {
        const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
        if (!allowedTypes.includes(file.mimetype)) {
            const error = new Error('Wrong file type')
            error.code = 'LIMIT_FILE_TYPES'
            return cb(error, false)
        }

        cb(null, true)
    }

    const MAX_SIZE = 250000

    var storage = multer.diskStorage({
        destination: function (req, file, cb) {
          cb(null, '../frontend/assets/images')
        },
        filename: function (req, file, cb) {
          cb(null, file.originalname)
        }
      })

    const upload = multer ({
        storage: storage,
        fileFilter,
        limits: {
            fileSize: MAX_SIZE
        },

    })

    routes.post('/upload', upload.single('file'), (req, res) => {
      res.json({ file: req.file })
    })

    return routes
  }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...