Ошибка 500 (внутренняя ошибка сервера) при загрузке изображений - PullRequest
0 голосов
/ 10 июля 2019

Когда я пытаюсь загрузить изображения с облачным сервисом, я получаю ошибку 500. Он не работает ни локально, ни когда мой сервер развернут на Heroku.

Я настроил конфигурационную переменную как в Heroku, так и в env. файл: https://i.stack.imgur.com/ZJxeq.png

В консоли я получаю эту ошибку:

POST https://world -map-mq.herokuapp.com / country / create 500 (Внутренняя ошибка сервера).

Ошибка: запрос не выполнен с кодом состояния 500

at createError (createError.js: 17).

при заселении (урегулирование.js: 19).

в XMLHttpRequest.handleLoad (xhr.js: 60).

В Heroku мой лог выглядит так:

2019-07-12T14: 16: 14.091247 + 00: 00 приложение [web.1]: сервер запущен

2019-07-12T14: 16: 15.212574 + 00: 00 heroku [роутер]: at = метод информации = OPTIONS path = "/ country / create" host = world-map-mq.herokuapp.com request_id = d6c8ca5b- 18a4-48e2-9846-36911d07c5cd fwd = "92.151.32.102" dyno = web.1 connect = служба 1 мс = состояние 14 мс = 204 байта = 494 протокола = https

2019-07-12T14: 16: 15.821978 + 00: 00 heroku [router]: at = метод info = путь POST = "/ country / create" host = world-map-mq.herokuapp.com request_id = 1eab82fd- df0c-4ad4-950f-17592cd6257e fwd = "92.151.32.102" dyno = web.1 connect = служба 0 мс = состояние 500 мс = 500 байт = протокол 499 = протокол https

Загрузка является обратным вызовом:

const cloudinary = require("cloudinary").v2;
require("dotenv").config();
const uid2 = require("uid2");

cloudinary.config({
  cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
  api_key: process.env.CLOUDINARY_API_KEY,
  api_secret: process.env.CLOUDINARY_API_SECRET
});

const uploadPictures = (req, res, next) => {
  const files = req.body.files;
  let filesUploaded = 0;

  if (files && files.length) {
    files.forEach(file => {
      // Je crée un nom spécifique pour le fichier
      const name = String(uid2(16));
      cloudinary.uploader.upload(
        file,
        {
          public_id: `/country/${req.body._id}/${name}`
        },
        (error, result) => {
          if (error) {
            return res.status(500).json("Une erreur est survenue");
          }
          pictures.push(result);
          filesUploaded++;
          if (filesUploaded === files.length) {
            req.pictures = pictures.map(pic => pic.secure_url);

            console.log(req.pictures);
            // ... et je poursuis ma route avec `next()`
            next();
          }
        }
      );
    });
  } else {

    next();
  }
};

module.exports = uploadPictures;

Вот часть маршрута, где я использую обратный вызов:


router.post("/country/create", uploadPictures, async (req, res, next) => {
  try {
    const countryKnown = await Country.findOne({
      countryVisited: req.body.countryVisited
    });
    // const countryVisitedCode = ;
    if (countryKnown) {
      res.json({ message: "Country already existing" });
    } else {
      const newCountry = new Country({
        countryVisited: req.body.countryVisited,
        countryVisitedCode: countries.getCode(req.body.countryVisited),
        description: req.body.description,
        title: req.body.title,
        pictures: req.pictures
      });
      await newCountry.save(function(err) {
        return res.status(200).json({
          _id: newCountry._id,
          countryVisited: newCountry.countryVisited,
          countryVisitedCode: newCountry.countryVisitedCode,
          description: newCountry.description,
          title: newCountry.title,
          pictures: newCountry.pictures,
          message: "Created"
        });
      });
    }
  } catch (error) {
    console.log("yolo", { error });
    res.status(400).json({ error: error.message });
  }
});

// 2*1 READ
router.get("/country", async (req, res) => {
  try {
    const country = await Country.find();
    res.json(country);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

Вот часть фронта в React:


handleSubmit = async event => {
    event.preventDefault();
    try {
      const response = await axios.post(
        "https://world-map-mq.herokuapp.com/country/create",
        {
          countryVisited: this.state.countryVisited,
          description: this.state.description,
          title: this.state.title,
          files: this.state.files
        }
      );
      this.setState({
        countryVisited: "",
        description: "",
        title: "",
        files: []
      });
    } catch (error) {
      console.log(error);
      this.setState({ error: error });
      alert({ error: error.message });
    }
  };


 handleFiles = files => {
    const newFiles = [...this.state.files, ...files.base64];
    this.setState({ files: newFiles });
  };

render() {
    if (this.state.isLoading) {
      console.log("loading");
      // ce que l'on veut render avant le chargement
      return null;
    }
    // ce que l'on veut render avant le chargement
    return (
      <div>
        <form onSubmit={this.handleSubmit}>

 <ReactFileReader
            fileTypes={[".png", ".jpg"]}
            base64={true}
            multipleFiles={true}
            handleFiles={this.handleFiles}
          >
            <div>Choisir une photo</div>
          </ReactFileReader>
   <input type="submit" value="Valider" />
        </form>
      </div>

 );
  }
}

Не могли бы вы указать мне правильное направление для решения этой проблемы? Заранее спасибо:)

...