Ошибка извлечения POST в теле сообщения json с помощью парусов.js

Я получаю следующую ошибку в body-parser, когда пытаюсь отправить простое тело json в свой контроллер, используя fetch

    1] error: Unable to parse HTTP body- error occurred ::
 'SyntaxError: `Unexpected token -\n    at parse (/project/node_modules/body-parser/lib/types/json.js:83:15)\n    
    at /project/node_modules/body-parser/lib/read.js:116:18\n    at invokeCallback (/project/node_modules/raw-body/index.js:262:16)\n    at done (/project/node_modules/raw-body/index.js:251:7)\n    at IncomingMessage.onEnd (/project/node_modules/raw-body/index.js:307:7)\n    at emitNone (events.js:86:13)\n    at IncomingMessage.emit (events.js:185:7)\n    at endReadableNT (_stream_readable.js:973:12)\n    at _combinedTickCallback (internal/process/next_tick.js:74:11)\n    at process._tickDomainCallback (internal/process/next_tick.js:122:9)`'

Я отладил body-parser, и причина, по которой я обнаружил, что при синтаксическом анализе происходит сбой, заключается в том, что я получаю обернутую строку

------WebKitFormBoundary.

if (strict) {
    console.log("body--->", body);
  var first = firstchar(body)

  if (first !== '{' && first !== '[') {
    debug('strict violation')
    throw new SyntaxError('Unexpected token ' + first)
  }
}

body---> ------WebKitFormBoundaryE7nkf6ervMA9VlRo
[1] Content-Disposition: form-data; name="json"
[1] 
[1] {"hola":1}
[1] ------WebKitFormBoundaryE7nkf6ervMA9VlRo--

и я понятия не имею, как избавиться от этого.

Запрос довольно простой

var data = new FormData();
data.append( "json", JSON.stringify( {"hi": 1} ) );
const options = {
    credentials: 'include',
    body : body
};

var request = new Request('/api/settings', {
    method: 'POST',
    redirect: 'follow',
    headers: new Headers({
        'Content-Type': 'application/json'
    })
});

fetch(request, options).then(function(response) {
  ...
})

Пользовательский контроллер немного неуместен, потому что мой запрос никогда не достигает маршрута express, обернутого парусами.

'POST /settings': {
    controller: 'SettingsController',
    action: 'save'
},

Детали запроса.

Request URL:https://localhost:3005/settings
Request Method:POST
Status Code:400 Bad Request
Remote Address:[::1]:3005
Response Headers


HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=utf-8
Content-Length: 879
ETag: W/"36f-yM7k6L+nVm6aoKcn9HH5aQ"
Date: Wed, 01 Feb 2017 16:00:15 GMT
Connection: keep-alive
Request Headers
view parsed

POST /settings HTTP/1.1
Host: localhost:3005
Connection: keep-alive
Content-Length: 145
Pragma: no-cache
Cache-Control: no-cache
accept: application/json, application/xml, text/plain, text/html, *.*
Origin: https://localhost:3005
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
content-type: application/json
Referer: https://localhost:3005/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: sails.sid=s%3AjzHwjq3AK12uG5AMQTQRZLoQ-7WaWeWN.MP3Joor2lBWEMbkuDqaXj7Y7%2Fdj1v8PJ9kGTJtTGkLY
Request Payload
------WebKitFormBoundary8A2lXn22y5Rxm12f
Content-Disposition: form-data; name="json"

{"hi":1}
------WebKitFormBoundary8A2lXn22y5Rxm12f--

Я пробовал с несколькими образцами, но, похоже, я что-то упускаю из виду.


person Juan Picado    schedule 01.02.2017    source источник
comment
Вы пытались попасть в конечную точку API из почтальона или любой другой утилиты отправки запросов?   -  person Sapna Jindal    schedule 02.02.2017
comment
Попробуйте именно то, что Сапна написал выше. Получите доступ к API с Postman и проверьте. Возможно, что-то не так с вашим запросом. Как вы делаете свой запрос?   -  person Marek Urbanowicz    schedule 02.02.2017
comment
С Postman отлично работает, используя ту же конфигурацию, с включенным content-type: application/json я могу получить доступ к своему контроллеру. Сегодня я нашел решение здесь stackoverflow.com/questions/29775797/fetch-post-json-data, с fetch я должен использовать 'Content-Type': 'x-www-form-urlencoded' вместо другого (я использую Chrome 56), чтобы он работал. Вот интересно, а почему бы и не с content-type: application/json   -  person Juan Picado    schedule 02.02.2017


Ответы (1)


В чем причина создания объекта FormData?

Можно упростить как

fetch(new Request('/api/settings', {
    method: 'POST',
    redirect: 'follow',
    headers: new Headers({
      'Content-Type': 'application/json'
    })
  }), {
    credentials: 'include',
    body: JSON.stringify({
      "hi": 1
    })
  })
  .then(r => console.log)
  .catch(e => console.error)

введите здесь описание изображения

person Krzysztof Safjanowski    schedule 02.02.2017
comment
Спасибо, вы были правы, нет смысла использовать FormData, если мое тело все равно json. Спасибо. - person Juan Picado; 02.02.2017