Если вы используете Express (высокопроизводительная, высококлассная веб-разработка для Node.js), вы можете сделать это:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
API-клиент:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "john@example.com"
}
})
});
Node.js: (начиная с Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (для Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Вы можете использовать
querystring
модуль:Теперь, например, если у вас есть
input
поле с именемage
, вы можете получить к нему доступ с помощью переменнойpost
:источник
var POST = qs.parse(body); // use POST
только для таких нубов, как я: если имя поля ввода текста «пользователь»,Post.user
будут отображаться данные этого поля. Напримерconsole.log(Post.user);
readable
обратный вызов вместо встраивания данных в строку тела. После того, как его уволят, тело доступно черезrequest.read();
req.connection.destroy();
это не мешает выполнению обратных вызовов! Например, обратный вызов "on end" будет выполнен с усеченным телом! Это, вероятно, не то, что вы хотите ...Обязательно разорвите соединение, если кто-то попытается заполнить вашу RAM!
источник
var POST = qs.parse(body); // use POST
только для нубов: когда имя поля ввода текста «пользователь», Post.user покажет данные этого поля. например console.log (Post.user);Многие ответы здесь больше не являются хорошей практикой или ничего не объясняют, поэтому я и пишу это.
основы
Когда вызывается обратный вызов http.createServer, это когда сервер фактически получил все заголовки для запроса, но возможно, что данные еще не получены, поэтому мы должны ждать этого. Объект http-запроса (экземпляр http.IncomingMessage) фактически является читаемым потоком . В читаемых потоков всякий раз , когда порция данных приходит, генерируется событие (если вы зарегистрировали обратный вызов к нему) , и когда все куски прибыли событие генерируется. Вот пример того, как вы слушаете события:
data
end
Преобразование буферов в строки
Если вы попробуете это, вы заметите, что блоки являются буферами . Если вы не имеете дело с двоичными данными и вам нужно вместо этого работать со строками, я предлагаю использовать метод request.setEncoding, который вызывает потоковые строки выброса, интерпретируемые с заданной кодировкой, и правильно обрабатывает многобайтовые символы.
Буферизация кусков
Теперь вы, вероятно, не заинтересованы в каждом чанке по отдельности, поэтому в этом случае вы, вероятно, захотите поместить его в буфер следующим образом:
Здесь используется Buffer.concat , который просто объединяет все буферы и возвращает один большой буфер. Вы также можете использовать модуль concat-stream, который делает то же самое:
Разбор контента
Если вы пытаетесь принять отправку POST в HTML-формах без файлов или обрабатывает вызовы jQuery ajax с типом контента по умолчанию, тогда тип контента
application/x-www-form-urlencoded
сuft-8
кодировкой. Вы можете использовать модуль querystring, чтобы десериализовать его и получить доступ к свойствам:Если вы используете тип контента JSON, вы можете просто использовать JSON.parse вместо qs.parse .
Если вы имеете дело с файлами или обрабатываете многокомпонентный тип контента, то в этом случае вам следует использовать что-то вроде грозного, что устраняет все трудности при работе с ним. Посмотрите на этот другой мой ответ, где я разместил полезные ссылки и модули для многокомпонентного контента.
кант
Если вы не хотите анализировать содержимое, а просто передать его куда-то еще, например, отправить его в другой http-запрос в качестве данных или сохранить его в файл, я советую отправлять его по трубопроводу, а не буферизовать, так как это будет меньше код, лучше справляется с обратным давлением, занимает меньше памяти, а в некоторых случаях быстрее.
Итак, если вы хотите сохранить содержимое в файл:
Ограничение количества данных
Как уже отмечалось в других ответах, имейте в виду, что злонамеренные клиенты могут отправлять вам огромное количество данных, чтобы вызвать сбой вашего приложения или заполнить вашу память, чтобы защитить вас, чтобы убедиться, что вы отбрасываете запросы, которые передают данные, превышающие определенный предел. Если вы не используете библиотеку для обработки входящих данных. Я бы предложил использовать что-то вроде stream-meter, которое может прервать запрос, если достигнет указанного предела:
или
или
Модули NPM
В то время как я описал выше, как вы можете использовать тело HTTP-запроса, для простой буферизации и анализа содержимого, я предложил использовать один из этих модулей, а не реализовывать их самостоятельно, поскольку они, вероятно, будут лучше обрабатывать крайние случаи. Для экспресса я предлагаю использовать body-parser . Для Коа есть аналогичный модуль .
Если вы не используете рамки, тело довольно хорошо.
источник
request
используется повторно иrequest.on('end')
вызывается несколько раз? Как я могу избежать этого?request.on('end', ...)
будет вызываться.Вот очень простая оболочка без фреймворка, основанная на других ответах и статьях, размещенных здесь:
Пример использования:
источник
response.post
а не более логичнымrequest.post
. Я обновил пост.Будет лучше, если вы закодируете свои данные в JSON , а затем отправите их в Node.js.
источник
qs.parse()
, чтобыJSON.parse()
превратить тело в нечто полезное. Пример:,var post = JSON.parse(body);
затем получите доступ к данным с помощьюpost.fieldname
. (Мораль истории, если вы не понимаете, что видите, не забывайтеtypeof
!)request.setEncoding
чтобы заставить это работать должным образом, иначе это может не обрабатывать символы не ascii должным образом.Для тех, кто интересуется, как выполнить эту тривиальную задачу без установки веб-фреймворка, мне удалось собрать все вместе. Вряд ли производство готово, но, похоже, работает.
источник
Вы можете использовать
body-parser
промежуточное ПО для анализа тела Node.js.Первая загрузка
body-parser
Пример кода
Больше документации можно найти здесь
источник
Ссылка: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
источник
Вот как вы можете это сделать, если вы используете node-formidable :
источник
Если вы предпочитаете использовать чистый Node.js, вы можете извлечь данные POST, как показано ниже:
источник
1) Установить
'body-parser'
с нпм.2) Тогда в вашем app.ts
3) тогда нужно написать
в модуле app.ts
4) имейте в виду, что вы включаете
в верхней части или перед любым объявлением модуля.
Пример:
5) Тогда используйте
источник
Если вы не хотите разбивать свои данные на части вместе с
data
обратным вызовом, вы всегда можете использоватьreadable
обратный вызов, например, так:Этот подход изменяет входящий запрос, но как только вы закончите свой ответ, запрос будет собираться мусором, так что это не должно быть проблемой.
Продвинутым подходом было бы сначала проверить размер тела, если вы боитесь огромных тел.
источник
request
является нормальным потоком node.js, поэтому вы можете проверитьrequest.headers
длину тела и при необходимости прервать запрос.Есть несколько способов сделать это. Однако самый быстрый способ, который я знаю, - это использовать библиотеку Express.js с body-parser.
Это может работать для строк, но я бы изменил bodyParser.urlencoded на bodyParser.json, если данные POST содержат массив JSON.
Больше информации: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
источник
Вам нужно получать
POST
данные порциями, используяrequest.on('data', function(chunk) {...})
Вы должны рассмотреть возможность добавления ограничения размера в указанной позиции, как предложено .
источник
setTimeout
который завершает соединение через определенный период времени, если полный запрос не получен в этом окне.Экспресс v4.17.0
источник
Если вы используете Express.js , прежде чем вы сможете получить доступ к req.body, вы должны добавить middleware bodyParser:
Тогда вы можете попросить
источник
И если вы не хотите использовать весь фреймворк, такой как Express, но вам также нужны разные виды форм, в том числе загрузки, тогда формалинайн может быть хорошим выбором.
Это перечислено в модулях Node.js
источник
Я нашел видео, которое объясняет, как этого добиться: https://www.youtube.com/watch?v=nuw48-u3Yrg
Он использует модуль http по умолчанию вместе с модулями querystring и stringbuilder. Приложение берет два числа (используя два текстовых поля) с веб-страницы и после отправки возвращает сумму этих двух (вместе с сохранением значений в текстовых полях). Это лучший пример, который я мог найти где-либо еще.
Связанный исходный код:
источник
Для тех, кто использует сырую двоичную загрузку POST без затрат на кодирование, вы можете использовать:
клиент:
сервер:
источник
Вы можете использовать промежуточное программное обеспечение Express , в которое теперь встроен анализатор тела. Это означает, что все, что вам нужно сделать, это следующее:
Этот пример кода ES6 с Express 4.16.x
источник
Вы можете извлечь параметр сообщения без использования экспресс.
1:
nmp install multiparty
2: импорт многопартийности. в виде
var multiparty = require('multiparty');
3: `
4: и ФОРМА HTML ЕСТЬ.
Я надеюсь, что это будет работать для вас. Спасибо.
источник
Ограничьте размер POST, чтобы избежать затопления вашего узла приложения. Существует отличный модуль raw-body , подходящий как для экспресс, так и для соединения, который может помочь вам ограничить запрос по размеру и длине.
источник
Если это связано с загрузкой файла, браузер обычно отправляет его как
"multipart/form-data"
тип контента. Вы можете использовать это в таких случаяхСсылка 1
Ссылка 2
источник
На полях формы, как эти
некоторые из приведенных выше ответов потерпят неудачу, потому что они поддерживают только плоские данные.
Сейчас я использую ответ Кейси Чу, но с модулем «qs» вместо модуля «querystring». Это модуль, который использует body-parser . Поэтому, если вы хотите вложенные данные, вы должны установить qs.
Затем замените первую строку следующим образом:
источник
Вы можете легко отправить и получить ответ на запрос POST, используя «Запрос - упрощенный HTTP-клиент» и Javascript Promise.
источник
Вам нужно использовать bodyParser (), если вы хотите, чтобы данные формы были доступны в req.body. body-parser анализирует ваш запрос и преобразует его в формат, из которого вы можете легко извлечь необходимую информацию.
Например, предположим, у вас есть форма регистрации на вашем веб-интерфейсе. Вы заполняете его и запрашиваете сервер, чтобы сохранить данные где-нибудь.
Извлечение имени пользователя и пароля из вашего запроса выполняется так же просто, как показано ниже, если вы используете body-parser.
.............................................................
источник
ОДИН ЛАЙНЕР без СРЕДНЕГО ОБЕСПЕЧЕНИЯ
Если вы публикуете следующие данные, то
'name':'ABC'
вы можете проанализировать их, используя следующий один лайнер,
источник