Node.js express.json промежуточное ПО не обрабатывает запрос, как ожидалось
У меня есть простой cURL (я думаю, это правильно), который размещает небольшой объект JSON для моего экспресс-сервера:
curl -d "{'test': 'this'}" localhost:3000/rest/user/authenticate
Я настроен как:
// set up body parsing in express to be able to get parse JSON posts
server.use(express.json());
server.use(express.urlencoded());
и иметь обработчик, который принимает маршрут:
JSON = require('JSON')
module.exports = {
authenticateUser: function create(req, res){
var postedObject = req.body
console.log(postedObject)
res.send('Handle Post: authenticateUser');
}
}
обработчик получает вызов, но он неожиданно регистрирует тело JSON:
{ '{\'test\': \'this\'}': '' }
Таким образом, весь мой объект выглядит как сторона имени объекта JSON Name: Value. независимо от того, что я публикую, похоже, добавляет ценность. Если я не сделаю что-то вроде этого:
curl -d "a=a" localhost:3000/rest/user/authenticate
который регистрирует:
{'a':'a'}
поэтому я не устанавливаю правильные заголовки? Неправильно настроен? Я планирую копать через экспресс-код, но задавался вопросом, может ли кто-нибудь узнать, прежде чем я найду решение. В любом случае, с поиском/индексированным ответом на это в Интернете будет приятно.
update 1
ok Мне нужно добавить заголовок в cURL
curl -H "Content-Type: application/json" -d "{'test': 'this'}" localhost:3000/rest/user/authenticate
который дает ошибку:
Parsing: {'test': 'this'}
SyntaxError: Unexpected token '
at Object.parse (native)
at C:\blah\node_modules\express\node_modules\connect\lib\middleware\json.js:86:19
at IncomingMessage.onEnd (C:blah\node_modules\express\node_modules\connect\node_modules\raw-body\index.js:109:7)
at IncomingMessage.g (events.js:180:16)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
ИЛИ curl -H "Content-Type: application/json" -d "{test: 'this'}" localhost: 3000/rest/user/authenticate
который дает ошибку:
Parsing: {test: 'this'}
SyntaxError: Unexpected token t
at Object.parse (native)
at C:\blah\node_modules\express\node_modules\connect\lib\middleware\json.js:86:19
at IncomingMessage.onEnd (C:blah\node_modules\express\node_modules\connect\node_modules\raw-body\index.js:109:7)
at IncomingMessage.g (events.js:180:16)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
update 2
в файле connect/lib/middleware/json.js
эта строка, по-видимому, вызывает проблемы
req.body = JSON.parse(buf, options.reviver);
обновление 3
Я действительно думаю, что это мой cURL
buf= JSON.stringify({test: 'This'});
console.log(buf)
req.body = JSON.parse(buf, options.reviver);
работает журнал регистрации { "Тест": "this"}
а затем в моем обработчике:
----------------------
{ test: 'this' }
----------------------
Ответы
Ответ 1
1) Межсоединение JSON работает только в том случае, если запрос имеет заголовок Content-Type: application/json
.
2) Действительный JSON должен содержать "
, а не '
.
Так что это должно быть '{"test": "this"}'
вместо "{'test': 'this'}"
Попробуйте выполнить следующую команду:
curl -d '{"test": "this"}' -H "Content-Type: application/json" localhost:3000/rest/user/authenticate
Ответ 2
Ответ имеет две части
- добавить заголовок содержимого
-
на окнах проходит боль при правильной передаче json, cURL на моей машине с Windows не занимается перестановкой одиночных и двойных кавычек, поэтому правильный cURL
curl -H "Content-Type: application/json" -d "{" "test "" ": "" "this" "" }" localhost: 3000/rest/user/authenticate
Внутри параметра данных вам нужно использовать три двойных кавычки для отправки одной двойной кавычки на сервер.
Принятие ответа на zub, потому что он прав. Я пробовал кучу вещей, чтобы обойти здесь окна.
Ответ 3
Для тех, кто использует почтальон, как я, просто попробуйте отправить запрос как POST → RAW и создать свой Json, чтобы сделать сообщение, в моем тесте я создал простой json, как это, и работает:
{ "name": "test"
}
Использование форм-данных или x-www-form-urlencoded не работает.
Ответ 4
Под Windows cmd:
curl -H "Content-Type: application/json" -d "{"""test""": """this"""}" localhost:3000/rest/user/authenticate
или используйте cygwin:
curl -H "Content-Type: application/json" -d '{"test": "this"}' localhost:3000/rest/user/authenticate
Мои 2 цента