У меня есть следующий код Node.js:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Теперь, если я отправлю что-то вроде:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Я получаю, Someone
как ожидалось. А что если я хочу получить полное тело запроса? Я попытался сделать, response.write(request.body)
но Node.js выдает исключение, говорящее « первый аргумент должен быть строкой или буфером », затем переходит в «бесконечный цикл» с исключением, которое говорит: « Невозможно установить заголовки после их отправки. »; это также верно, даже если бы я var reqBody = request.body;
и тогда писал response.write(reqBody)
.
В чем здесь проблема?
Кроме того, я могу просто получить необработанный запрос без использования express.bodyParser()
?
javascript
node.js
express
TheBlueSky
источник
источник
response.write(reqBody)
; когда я используюresponse.send(reqBody)
вещи работают нормально ... и да, я используюresponse.end
послеresponse.write
.Ответы:
Экспресс 4.0 и выше:
$ npm install --save body-parser
И тогда в вашем приложении узла:
Экспресс 3.0 и ниже:
Попробуйте передать это в вашем вызове cURL:
--header "Content-Type: application/json"
и убедитесь, что ваши данные в формате JSON:
{"user":"someone"}
Также вы можете использовать console.dir в вашем коде node.js, чтобы увидеть данные внутри объекта, как в следующем примере:
Этот другой вопрос также может помочь: Как получить JSON в экспресс-запросе node.js POST?
Если вы не хотите использовать bodyParser, проверьте этот другой вопрос: https://stackoverflow.com/a/9920700/446681
источник
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
но он выдавал мне ошибку " Неожиданный токен u ", поэтому я переключился на упомянутый вызов в своем исходном сообщении.express.bodyParser()
не рекомендуется в Express 4.x. Вместо этого используйте npmjs.org/package/body-parser .echo any"thing"
. Данные, которые вы публикуете, должны быть в кавычках, чтобы этого не происходило.Начиная с Express v4.16 нет необходимости в дополнительных модулях, просто используйте встроенное промежуточное ПО JSON :
Как это:
Примечание -
body-parser
от которого это зависит, уже включено в экспресс.Также не забудьте прислать шапку
Content-Type: application/json
источник
Начиная с Express 4, следующий код, кажется, делает свое дело. Обратите внимание, что вам нужно установить
body-parser
с помощьюnpm
.источник
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
, также требуется? Я размещаю довольно сложный документ как JSON в запросе, иextended: false
он не работает. Только когда я установил значение true, запрос будет правильно проанализирован.app.use(bodyParser.urlencoded({ extended: true }));
ANDapp.use(bodyParser.json())
для получения данных json на сервере AWS Linux с NodeJS и Express.Это поможет вам. Я полагаю, вы отправляете тело в JSON.
источник
Для 2019 года вам не нужно устанавливать
body-parser
.Ты можешь использовать:
источник
Это может быть достигнуто без
body-parser
зависимости , а также, слушатьrequest:data
иrequest:end
и возвращать ответ на конец запроса см ниже примере кода. ссылка: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyисточник
Попробуй это:
Это возьмет
bodyParser
созданный для вас объект, превратит его обратно в строку и запишет в ответ. Если вы хотите , точное тело запроса (с тем же пробелом, и т.д.), вы будете нуждаться ,data
иend
слушатели прилагается к запросу до и создать строковый кусок на кусок , как вы можете видеть в JSON источника синтаксического анализа кода от подключения .источник
Вы утверждаете, что «пытались делать» именно то, что написали в коде, который работает «как положено», когда вы вызываете его с помощью curl.
Ошибка, которую вы получаете, похоже, не связана с каким-либо кодом, который вы нам показали.
Если вы хотите , чтобы получить сырье запроса, установить обработчик на
request
дляdata
иend
событий (и, конечно, удалить инвокацииexpress.bodyParser()
). Обратите внимание, чтоdata
события будут происходить в чанках, и если вы не установите кодировку дляdata
события, эти чанки будут буферами, а не строками.источник
request.body
и нетrequest.body.user
, и я исправил это сейчас. Кстати, этоvar reqBody = request.body;
было и остается правильным, и когда вы попробуете это, вы получите ошибку, которую я получаю. В любом случае, не могли бы вы привести пример установки обработчикаrequest
; Я не нахожу это в экспресс-руководстве.Если вы достаточно ленивы, чтобы читать куски данных поста. Вы можете просто вставить строки ниже, чтобы прочитать JSON.
Ниже для TypeScript подобное можно сделать и для JS.
app.ts
В любом вашем контроллере, который получает вызов POST, используйте, как показано ниже
userController.ts
источник
Я абсолютно новичок в JS и ES, но мне кажется, что это работает так:
Дайте мне знать, если что-то не так с этим!
источник
Установите парсер тела командой ниже
Настройте парсер тела
источник
Вы используете следующий код для регистрации данных поста:
источник