无法将文件上传到数据库(后端)

时间:2020-01-29 09:40:24

标签: node.js express sequelize.js

我正在尝试将文件上传到我的数据库,但是遇到了麻烦。

当我尝试将文件上传到数据库时,出现此错误: 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
  };

我试图复制用于注册用户的功能,但是当有人上传文件时用于复制文件。

注册(有效):

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
  };

但是我遇到了无限循环,并且文件没有上传到我的数据库(什么都没有创建)。

上传到后端(上传文件夹)有效。

编辑

当我对文件数据使用req.files.file.something有时可以正常工作时,该文件已正确上传到数据库,但是又出现了错误(我认为当文件很小时它可以工作)。

对于1 Ko文件:

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 :(得分:0)

我相信这是因为您试图在同一个呼叫处理程序中发送两个响应。一次进入uploadfile.mv,然后再次进入Upload.findOne。您不能将两个res.X返回到同一请求。

该线程可能有用:Error: Can't set headers after they are sent to the client

答案 1 :(得分:0)

您可以在下面尝试以下代码:

return Disposables.create { task.cancel() }

希望它可以帮助您上传文件。