Проблема с загрузкой файла в базу данных (бэкэнд) - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь загрузить файлы в свою базу данных, но у меня возникают проблемы.

Когда я пытаюсь загрузить файл в свою базу данных, я получаю эту ошибку: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

И данные из моего файла не сохраняются в моей базе данных (см. Изображение): enter image description here

Я думаю, что моя проблема здесь:

  const fileData = {
    type: req.body.type,
    name: req.body.name,
    data: req.body.data
  };

I попытался скопировать функцию, которую я использую для создания пользователя, когда он регистрируется, но для файла, когда кто-то загружает его.

Регистрация (работает):

users.post("/register", (req, res) => {
  const today = new Date();
  const userData = {
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    email: req.body.email,
    password: req.body.password,
    phone: req.body.phone,
    deliveryAddress: req.body.deliveryAddress,
    created: today
  };

  User.findOne({
    where: {
      email: req.body.email
    }
  })
    //TODO bcrypt
    .then(user => {
      if (!user) {
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          userData.password = hash;
          User.create(userData)
            .then(user => {
              res.json({ status: user.email + " registered!" });
            })
            .catch(err => {
              res.send("error: " + err);
            });
        });
      } else {
        res.status(400).json({ error: "Email already taken" });
        console.log("Email already taken !");
      }
    })
    .catch(err => {
      res.status(400).json("Error : " + err);
    });
});

Загрузка файла (не работает):

app.post("/files", (req, res) => {
  const uploadFile = req.files.file;
  const fileName = req.files.file.name;
  const fileData = {
    type: req.body.type,
    name: req.body.name,
    data: req.body.data
  };
  uploadFile.mv(`./uploads/${fileName}`, function(err) {
    if (err) {
      return res.status(500).send(err);
    }
    res.json({
      file: `uploads/${fileName}`
    });
  });
  Upload.findOne({
    where: {
      name: req.body.name
    }
  })
    .then(file => {
      if (!file) {
        Upload.create(fileData)
          .then(file => {
            res.json({ status: file.name + " created !" });
          })
          .catch(err => {
            res.send("error: " + err);
          });
      } else {
        res.status(400).json({ error: "File already uploaded" });
        console.log("File already uploaded");
      }
    })
    .catch(err => {
      res.status(400).json("Error : " + err);
    });
});

Я не очень знаком с бэкэндом, поэтому ... Я попытался изменить:

  const fileData = {
    type: req.body.type,
    name: req.body.name,
    data: req.body.data
  };

с помощью

  const fileData = {
    type: req.files.file.type,
    name: req.files.file.name,
    data: req.files.file.data
  };

Но я получил бесконечное число l oop, и файл не загружен в мою базу данных (ничего не создано).

Загрузка в бэкэнд (папка загрузки) работает.

РЕДАКТИРОВАТЬ

Когда я использую req.files.file.something для fileData, он иногда работает, файл корректно загружается в базу данных, но я снова получаю сообщение об ошибке (думаю, что это работает, когда T файл очень маленький).

Для файла 1 Ко:

Executing (default): INSERT INTO `files` (`id`,`name`,`data`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'a suprimer.html',X'3c21444f43545950452068746d6c3e0d0a0d0a3c21444f43545950452068746d6c3e0d0a3c68746d6c3e0d0a3c686561643e200d0a093c6d65746120636861727365743d227574662d38223e0d0a093c7469746c653e20466169726520756e6520696d6167653c2f7469746c653e0d0a3c2f686561643e0d0a3c626f64793e0d0a0d0a093c703e746573743c2f703e0d0a0d0a093c696d67207372633d2268642e696d6167652e736e6f772e6a706567223e0d0a090d0a0d0a3c2f626f64793e0d0a3c2f68746d6c3e','2020-01-29 10:07:28','2020-01-29 10:07:28');

И в базе данных: enter image description here

Почему тип не настроен? Как я могу уменьшить время загрузки файла большего размера?

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Вы можете попробовать этот код ниже:

app.post("/files", (req, res) => {
  const uploadFile = req.files.file;
  const fileName = req.files.file.name;
  const fileData = {
    type: req.body.type,
    name: req.body.name,
    data: req.body.data
  };
  Upload.findOne({
    where: {
      name: req.body.name
    }
  }).then(file => {
      if (!file) {
        // upload file to directory
        uploadFile.mv(`./uploads/${fileName}`);
        // save file to database
        Upload.create(fileData)
          .then(file => {
            return res.json({ status: file.name + " created !" });
          }).catch(err => {
            return res.send("error: " + err);
          });
      } else {
        return res.status(400).json({ error: "File already uploaded" });
      }
    })
    .catch(err => {
      return res.status(400).json("Error : " + err);
    });
});

Надеюсь, это поможет вам загрузить ваш файл.

0 голосов
/ 29 января 2020

Я полагаю, это потому, что вы пытаетесь отправить два ответа в одном и том же обработчике вызовов. Один раз в uploadfile.mv, затем снова в Upload.findOne. Вы не можете вернуть два res.X к одному и тому же запросу.

Этот поток может быть полезен: Ошибка: невозможно установить заголовки после их отправки клиенту

...