Все выглядит нормально, если только символ обратной косой черты в JSON не приходит от клиента на сервер Express с body-parser.
Тело запроса выглядит следующим образом (мы помещаем это в Postman (необработанное значение) и Swagger-UI как:
{
"username": "admin",
"password": "abc%\-xyz"
}
Код curl почтальона выглядит так:
curl -X POST \
http://localhost:3000/login \
-H 'Content-Type: application/json' \
-H 'Postman-Token: ef96edfd-dc43-47fe-89c0-76e562fa206d' \
-H 'cache-control: no-cache' \
-d '{
"username": "admin",
"password": "abc%\-xyz"
}'
Код curl Swagger-UI:
curl -X POST "http://localhost:3000/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"username\": \"admin\", \"password\": \"abc%\\-xyz\"}"
Я. Не знаю, в чем разница между Swagger-UI и Postman, но похоже, что в свитке Swagger есть еще один обратный слеш. Но на стороне сервера нет никакой разницы.
Действительно, я не могу контролировать тело запроса, которое приходит от клиента, и пароли могут содержать такие символы, как обратная косая черта. Приложение всегда выдает эту ошибку:
SyntaxError: Unexpected number in JSON at position 45
at JSON.parse (<anonymous>)
at parse (/path/to/project/node_modules/body-parser/lib/types/json.js:93:19)
at /path/to/project/node_modules/body-parser/lib/read.js:121:18
at invokeCallback (/path/to/project/node_modules/raw-body/index.js:224:16)
at done (/path/to/project/node_modules/raw-body/index.js:213:7)
at IncomingMessage.onEnd (/path/to/project/node_modules/raw-body/index.js:273:7)
at IncomingMessage.emit (events.js:189:13)
at endReadableNT (_stream_readable.js:1103:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
Если JSON становится с двумя обратными слешами (\):
{
"username": "admin",
"password": "abc%\\-xyz"
}
Тогда на стороне сервера больше нет ошибок (внутри функции route.post ()), но body.password имеет еще две обратные косые черты: abc%\\-xyz
Как было указано в комментариях, это может быть проблемой синтаксического анализа.
Как правильно с этим бороться?
bodyParser.json({strict: false})
не помогает