Когда я пытаюсь загрузить изображения с облачным сервисом, я получаю ошибку 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>
);
}
}
Не могли бы вы указать мне правильное направление для решения этой проблемы?
Заранее спасибо:)