我正在尝试将文件上传到我的数据库,但是遇到了麻烦。
当我尝试将文件上传到数据库时,出现此错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
我认为我的问题在这里:
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');
为什么没有设置类型? 如何减少较大文件的上传时间?
答案 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() }
希望它可以帮助您上传文件。