Когда пользователь обновляет изображение своего профиля, я хочу удалить старый и обновить имя изображения в базе данных. Вновь загруженное изображение загружается с помощью команды response filepond и также удаляется всякий раз, когда загружается новое изображение. В ходе расследования я обнаружил, что запрос отправлялся дважды, поэтому файл удалялся после того, как он был загружен. После того, как я удалил последнюю строку кода, он перестал это делать и работал нормально. Но почему?
Контроллер:
const multerStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "public/img");
},
filename: (req, file, cb) => {
const ext = file.mimetype.split("/")[1];
cb(null, `hero-${Date.now()}.${ext}`);
}
});
// test if uploaded file is an image
const multerFilter = (req, file, cb) => {
if (file.mimetype.startsWith("image")) {
cb(null, true);
} else {
// throw error here
cb(console.log("not an image"), false);
}
};
const upload = multer({
storage: multerStorage,
fileFilter: multerFilter
});
exports.uploadUserPhoto = upload.single("bgImg");
exports.updateHeroImg = async (req, res) => {
const updateId = "5d13b3c6dd57c43828ed5a7a";
const hero = await Hero.findById(updateId);
if (!hero) return;
const oldImg = hero.bgImg;
fileHelper.deleteFile("public/img/" + oldImg);
if (req.file) hero.bgImg = req.file.filename;
const result = await hero.save();
res.status(200).send("image uploaded");
};
Как только я удалю эту строку, все будет нормально. Любые идеи?
res.status(200).send("image uploaded");
Это маршрут:
router.post("/", heroController.uploadUserPhoto, heroController.updateHeroImg);
В React у меня есть:
<FilePond
ref={ref => (this.pond = ref)}
files={this.state.files}
allowMultiple={false}
maxFiles={1}
instantUpload={false}
maxFileSize={5000000}
name="bgImg"
server={{
process: "http://localhost:8000/api/hero/",
load: "http://localhost:8000/img/"
}}
oninit={() => this.handleInit()}
onupdatefiles={fileItems => {
// Set currently active file objects to this.state
this.setState({
files: fileItems.map(fileItem => fileItem.file)
});
}}
//onprocessfile={() => this.uploadComplete()}
/>
uploadComplete = () => {
putImg(this.state.files);
toast.success("Image successfully updated");
};
router.post("/", heroController.uploadUserPhoto, heroController.updateHeroImg);
разве вы не вызываете 2 обработчика для одного и того же маршрута? - person Zee   schedule 08.08.2019next()
в промежуточном программном обеспеченииheroController.uploadUserPhoto
и отправлять ответ через финальный обратный вызовheroController.updateHeroImg
. - person ambianBeing   schedule 08.08.2019next()
, поэтому ваши маршруты кажутся нормальными со стороны сервера. Вы сказали, что запрос отправлялся дважды ... Итак, проверяем код клиента, как выглядитputImg(this.state.files);
? - person ambianBeing   schedule 08.08.2019export function putImg(img) { return axios.post(apiEndPointTwo, img); }
- person user8463989   schedule 08.08.2019onprocessfile={() => this.uploadComplete()}
pqina.nl/filepond/docs/patterns / api / filepond-instance, но после удаления этой строки моя проблема исправлена. Но я не знаю, как он теперь все еще работаетuploadComplete
, если это не называется. Я обновил свой вопрос ... - person user8463989   schedule 08.08.2019process: "http://localhost:8000/api/hero/",
, а затем я снова отправлял его сonprocessfile={() => this.uploadComplete()}
. Тайна раскрыта! (Думаю) - person user8463989   schedule 08.08.2019