2017-02-01 4 views
1

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

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-- 

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

+1

Вы попробуйте нажать конечную точку апи от почтальона или любых других запрос представляемых утилитов? –

+0

Попробуйте точно, что написал Сапна выше. API доступа с почтовым отправителем и проверка. Это может быть что-то неправильно с вашим запросом. Как вы делаете запрос? –

+0

С Postman работает отлично, используя ту же конфигурацию, с включенным 'content-type: application/json', я могу связаться со своим контроллером. Сегодня я нашел решение здесь http://stackoverflow.com/questions/29775797/fetch-post-json-data, с 'fetch' я должен использовать' 'Content-Type': 'x-www-form-urlencoded'' вместо этого другой (я использую Chrome 56), чтобы он работал. Поэтому я задаюсь вопросом, почему не с 'content-type: application/json' –

ответ

2

В чем причина создания 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) 

enter image description here

+1

Спасибо, вы были правы, не имеет смысла использовать' FormData', если я - тело 'json' в любом случае. Благодарю. –

Смежные вопросы