Подтвердить что ты не робот

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' }
----------------------
4b9b3361

Ответ 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 цента