В корне React-проекта (наверное) выполняем
npm i express cors body-parser
В корне React-проекта создаём файл
server.js
следующего содержания:
// импорты
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const path = require('path');
const fs = require('fs');
// пользовательские настройки:
// на каком порту слушать по умолчанию, можно заоверрайдить через переменную окружения PORT
const DEFAULT_PORT = 3001;
// полный путь файла, который перезаписываем (тут, относительно файла server.js)
const UPDATE_JSON_FILE = path.join(__dirname, 'rel/path/to/file.json');
// URL на сервере, в которую будем кидать POST-запрос
const UPDATE_JSON_ENDPOINT = '/api/update_json';
// конфигурирование обработчиков сервера и запуск на заданном порту
const server = express();
server.use(cors());
const rawParser = bodyParser.raw({type: '*/*'});
server.post(UPDATE_JSON_ENDPOINT, rawParser, (req, res) => {
const data = req.body instanceof Buffer ? req.body : Buffer.alloc(0);
fs.writeFile(UPDATE_JSON_FILE, data, (err) => {
if (!err) {
console.log(`Wrote ${Buffer.byteLength(data)} bytes`);
res.status(200).send('Success!');
} else {
console.log(err.toString());
res.status(500).send(err.toString());
}
});
});
server.get(UPDATE_JSON_ENDPOINT, (req, res) => { res.status(400).send('POST requests only!'); });
const port = process.env.PORT || DEFAULT_PORT;
console.log(`Listening on port ${port}`);
server.listen(port);
Запускаем этот "бэкенд":
node server.js
Альтернативно, с другим портом (по крайней мере, в bash такой синтаксис)
PORT=8080 node server.js
В общем, порт можно задать через переменную окружения PORT. Это так, подцепил из примеров для сервера Express.
Собственно, теперь можно отправить этому серверу JSON в POST-запросе, просто в тело засунуть. Как я понимаю, что-то вроде
fetch('http://localhost:3001/api/update_json', {method: 'POST', body: JSON.stringify(data)})…
Сервер возвращает 404 на неправильный путь, 400 на не-POST запрос на
/api/update_json
, 500 при ошибке записи в файл, ну и 200 если всё прошло успешно.
"Сервер" пишет в консоль, на каком порту начал слушать, и число записанных байтов при каждом правильном запросе (или ошибку при ошибке записи). Выключается, соответственно, Ctrl+C в консоли.
Также, если в
package.json
прописать
"proxy": "http://localhost:3001"
(с портом, соответствующим объективной реальности), то в React'е запрос можно посылать прямо на
'/api/update_json'
, т. е. относительный запрос, без хостнейма, а Реакт догадается, что запрос внешний относительно приложения, и пойдёт к нашему серверу.
Ну и да, никакой валидации JSON на стороне бэка нет, что в запросе — то и в файл.
Проверил на NodeJS v10.15.2