NodeJS: Multer не загружает файлы - PullRequest
0 голосов
/ 29 марта 2020

У меня есть NodeJS сервер, который выглядит следующим образом:

const path = require('path');

const express = require('express');
const mongoose = require('mongoose');
const helmet = require('helmet');
const multer = require('multer');

const io = require('./socket');
const messageRoutes = require('./routes/message');
const groupRoutes = require('./routes/group');
const authRoutes = require('./routes/auth');
const userRoutes = require('./routes/user');

const MONGODB_URI = `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@${process.env.MONGO_CLUSTER}-puhqm.gcp.mongodb.net/${process.env.MONGO_DEFAULT_DATABASE}?retryWrites=true&w=majority`;

const app = express();

const storage = multer.diskStorage({
  destination: 'files',
  filename: (req, file, cb) => {
    cb(null, `${new Date().getTime().toString()}-${file.originalname}`);
  }
});

const fileFilter = (req, file, cb) => {
  if (file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg' || file.mimetype === 'application/pdf') {
    cb(null, true);
  } else {
    cb(null, false);
  }
};

//Body Parser
app.use(express.urlencoded({ extended: false }));
app.use(express.json());

// Files Parser
app.use(multer({
  storage,
  fileFilter,
  limits: { fieldSize: 2 * 1024 * 1024 }
}).array('files', 4));

app.use('/files', express.static(path.join(__dirname, 'files')));

//Extra-Headers Configuration
app.use(helmet());

// CORS Configuration
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader(
    'Access-Control-Allow-Methods',
    'GET, POST, PUT, PATCH, DELETE'
  );
  res.setHeader(
    'Access-Control-Allow-Headers',
    'Content-Type, Authorization'
  );
  next();
});

// Routes
app.use(messageRoutes);
app.use(groupRoutes);
app.use(authRoutes);
app.use(userRoutes);

// Universal Error Handling
app.use((error, req, res, next) => {
  const status = error.statusCode || 500;
  res.status(status).json({error});
});

// Server And Database Configuration
mongoose.connect(MONGODB_URI, {
  useUnifiedTopology: true,
  useNewUrlParser: true
}).then(() => {
  const server = app.listen(process.env.PORT || 3000);
  io.init(server);
  io.initSocket();
}).catch(err => {throw err});

С клиента я отправляю запрос следующим образом:

const fileUploads = document.querySelector('#file').files;
const data = new FormData();
const files = [];
if (fileUploads.length > 0) {
  for (let i = 0; i < fileUploads.length; i++) {
    files.push(fileUploads[i]);
  }
}
const to = [groupId];
data.append('to[]', to[0]);
data.append('message', message);
data.append('groupId', groupId);
data.append('files[]', files);
const chatResponse = await fetch(`${baseURL}/message`, {
  method: 'POST',
  headers: {Authorization: `Bearer ${token}`},
  body: data
});

Однако, когда запрос отправляется соответствующему контроллеру req.files возвращает пустой массив, и никакие файлы не сохраняются в папке files, которая была настроена в конфигурации multer. Пожалуйста, как мне это исправить.

Примечание: я серьезно не знаю, что писать, и ТАК продолжает жаловаться, что мне нужно добавить еще некоторые детали. Я полагаю, что предоставил достаточно объяснений с описанием, названием и кодом.

1 Ответ

0 голосов
/ 29 марта 2020

это не исправляет ваш код, но может помочь. Multer - мощный инструмент для обработки загрузки файлов из запроса. но здесь есть лучшее решение для вас. express -fileupload.

https://www.npmjs.com/package/express-fileupload

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