res.status и res.send делают запрос дважды

Когда пользователь обновляет изображение своего профиля, я хочу удалить старый и обновить имя изображения в базе данных. Вновь загруженное изображение загружается с помощью команды 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");
  };

person user8463989    schedule 08.08.2019    source источник
comment
Эта функция вызывается с какого-то экспресс-маршрута?   -  person Matt Kuhns    schedule 08.08.2019
comment
Я отправляю запрос от React. Итак, я загружаю файл с помощью filepond в ответ и отправляю его на сервер, который использует экспресс, да. Он идет по маршруту, который идет к контроллеру. Я обновил свой вопрос, чтобы показать маршрут   -  person user8463989    schedule 08.08.2019
comment
router.post("/", heroController.uploadUserPhoto, heroController.updateHeroImg); разве вы не вызываете 2 обработчика для одного и того же маршрута?   -  person Zee    schedule 08.08.2019
comment
Маршрутизатор допускает несколько обратных вызовов, думаю, паспорт. Вы отправляете статус в heroController.uploadUserPhoto?   -  person Matt Kuhns    schedule 08.08.2019
comment
@Zee, извини, ты прав. Я обновил свой вопрос кодом для этого.   -  person user8463989    schedule 08.08.2019
comment
@MattKuhns, я обновил свой вопрос этим кодом. Я не отправляю туда статус.   -  person user8463989    schedule 08.08.2019
comment
@ user8463989 Разве вы не должны вызывать next() в промежуточном программном обеспечении heroController.uploadUserPhoto и отправлять ответ через финальный обратный вызов heroController.updateHeroImg.   -  person ambianBeing    schedule 08.08.2019
comment
@ambianBeing, не уверен на 100%, но я так не думаю.   -  person user8463989    schedule 08.08.2019
comment
@ambianBeing находится на правильном пути. Вот что-то похожее. Каждое промежуточное ПО должно вызывать next (). stackoverflow .com / questions / 22285677 /   -  person Matt Kuhns    schedule 08.08.2019
comment
@ user8463989 Итак, поскольку я использовал multer, покопался в его коде, и он действительно вызывает функцию next(), поэтому ваши маршруты кажутся нормальными со стороны сервера. Вы сказали, что запрос отправлялся дважды ... Итак, проверяем код клиента, как выглядит putImg(this.state.files);?   -  person ambianBeing    schedule 08.08.2019
comment
@ambianBeing, это довольно просто, это выглядит так: export function putImg(img) { return axios.post(apiEndPointTwo, img); }   -  person user8463989    schedule 08.08.2019
comment
Итак, я только что нашел причину проблемы. Я использовал этот обратный вызов для filepond: onprocessfile={() => this.uploadComplete()} pqina.nl/filepond/docs/patterns / api / filepond-instance, но после удаления этой строки моя проблема исправлена. Но я не знаю, как он теперь все еще работает uploadComplete, если это не называется. Я обновил свой вопрос ...   -  person user8463989    schedule 08.08.2019
comment
Я предполагаю, что эта строка запускает запрос, который я не осознавал. process: "http://localhost:8000/api/hero/",, а затем я снова отправлял его с onprocessfile={() => this.uploadComplete()}. Тайна раскрыта! (Думаю)   -  person user8463989    schedule 08.08.2019
comment
Да, так и должно быть. Я собирался теперь рыть пруд, которым не пользовался. Сохранено вашим комментарием: D   -  person ambianBeing    schedule 08.08.2019
comment
@ambianBeing, спасибо за вашу помощь. Просто разговор с кем-то помог мне решить эту проблему.   -  person user8463989    schedule 08.08.2019