JS Sapper: отправка данных на сервер (правильный путь?)

Как правильно отправлять данные на сервер с помощью Sapper JS lib?

Говоря: у меня есть страница «редактор доски», где я могу выбирать / снимать выделение плиток из гексагональной сетки, написанной в SVG, и добавлять / вычитать шестнадцатеричные координаты в массиве магазина.

Затем пользователь заполняет форму, указав доску: имя, автор и версию ... Нажатие кнопки сохранения приведет к отправке данных формы и массива в хранилище. Задача сервера - сохранить определение платы в файле 'static /boards / repository / [name] .json'.

Сегодня в сети мало подробностей, чтобы правильно использовать Sapper / Svelte с проблемами данных POSTing.

Как действовать ? Спасибо за ответы!

РЕДАКТИРОВАТЬ:

чтобы избежать повторной публикации всей страницы, что означает потерю состояния приложения, я рассматриваю возможность использования IFRAME с формой внутри .... но как запустить копию sapper внутри IFRAME, чтобы убедиться, что я могу использовать this.fetch () в нем?


person Hefeust    schedule 28.03.2019    source источник


Ответы (2)


Я использую Sapper + Svelte для веб-сайта, это действительно потрясающе! В моем компоненте контактной формы данные отправляются на сервер. Вот как это делается без iframe. Отправленные и полученные данные находятся в формате JSON.

На стороне клиента (компонент):

var data = { ...my contact JSON data... }
var url = '/process/contact' // associated script = /src/routes/process/contact.js

fetch(url, {
  method: 'POST',
  body: JSON.stringify(data),
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(r => {
  r.json()
    .then(function(result) {
      // The data is posted: do something with the result...
    })
})
.catch(err => {
  // POST error: do something...
  console.log('POST error', err.message)
})

На стороне сервера:

скрипт = /src/routes/process/contact.js

export async function post(req, res, next) {
  /* Initializes */
  res.setHeader('Content-Type', 'application/json')
  /* Retrieves the data */
  var data = req.body
  // Do something with the data...
  /* Returns the result */
  return res.end(JSON.stringify({ success: true }))
}

Надеюсь, это поможет!

person jack-y    schedule 03.06.2019
comment
Джек: Спасибо, что поделились. Очень полезно. Вопрос: вы используете сервер Polka или сервер Expressjs? - person Marco; 12.09.2019
comment
Марко: Сервер ExpressJS. Полька - это хорошо, но чаще всего используется Express: npmtrends.com/polka-vs-express - person jack-y; 13.09.2019
comment
Джек, извини, что побеспокоил тебя снова, но, прочитав несколько дней по этой теме, я сбит с толку. Как код contact.js обслуживается сервером? Я использовал expressjs много раз, дескриптор маршрутов совпадает с кодом на лицевой стороне, но здесь дескриптор сообщения в contact.js, который не является частью файла сервера. верный? Я новичок в стройности и сапёрстве. Пытаюсь их использовать. - person Marco; 15.09.2019
comment
Большое спасибо. Построил пример, и он сработал. Великолепное объяснение с вашей стороны. Я ценю это. - person Marco; 17.09.2019
comment
Нужно ли мне устанавливать body-parser и импортировать его в server.js или в js-файл дескриптора маршрута, чтобы читать и получать доступ к данным, опубликованным в вашем примере, который вы опубликовали? - person Marco; 27.09.2019
comment
Я пробовал ваш код, но когда я пытаюсь использовать console.log (data) в дескрипторе маршрута, он дает мне undefined? - person Marco; 27.09.2019
comment
Я разместил вопрос, поэтому нам не нужно использовать здесь раздел комментариев. Если вы щедро тратите свое время, пожалуйста, взгляните и дайте мне знать, как заставить его работать. Спасибо, stackoverflow.com/questions/58127604/ - person Marco; 27.09.2019
comment
Джек, не могли бы вы опубликовать файл server.js со всеми правильными настройками, чтобы я удостоверился, что на моем сервере установлены все нужные пакеты. Спасибо за помощь. - person Marco; 27.09.2019

Вместе с решением, приведенным выше, вы можете получить undefined при попытке прочитать опубликованные данные на стороне сервера.

Если вы используете стандартную версию Sapper, вы используете Polka. Чтобы включить анализ тела в Польке, вы можете сделать следующее.

npm install body-parser

В server.js добавьте следующее

const { json } = require('body-parser');

И под polka() добавить импортированный

.use(json())

Чтобы он в конце концов сказал что-то вроде

...
const { json } = require('body-parser');

polka() // You can also use Express
    .use(json())
    .use(
        compression({ threshold: 0 }),
        sirv('static', { dev }),
        sapper.middleware()
    )
    .listen(PORT, err => {
        if (err) console.log('error', err);
    });
person Community    schedule 27.12.2019
comment
Большое тебе спасибо. Я потратил целый день на то, чтобы заставить post метод работать. Я сходил с ума, и в этом была проблема. На самом деле не могу понять, почему команда Sapper сделала Polka стандартом, не включив такую ​​фундаментальную конфигурацию для использования метода post. - person Jacopo Pace; 21.05.2020