запрос.тело пустое на столбах



внезапно это произошло со всеми моими проектами.



всякий раз, когда я делаю сообщение в nodejs с помощью express и body-parser req.body это пустой объект.



var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});


через ajax и почтальона он всегда пуст.



однако через curl



$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/


он работает по назначению.



я попробовал вручную установить Content-type : application/json в первом, но я тогда всегда получаю 400 bad request



это сводило меня с ума.



I думал, что что-то Обновлено в body-parser, но я понизил рейтинг, и это не помогло.



любая помощь ценится, спасибо.

663   14  

14 ответов:

в Postman из 3 вариантов, доступных для типа контента, выберите "X-www-form-urlencoded", и он должен работать.

также, чтобы избавиться от сообщения об ошибке замена:

app.use(bodyParser.urlencoded())

С:

app.use(bodyParser.urlencoded({
  extended: true
}));

см.https://github.com/expressjs/body-parser

промежуточное программное обеспечение 'body-parser' обрабатывает только данные JSON и urlencoded, а не multipart

С помощью Postman, чтобы проверить действия HTTP post с помощью полезной нагрузки данных raw JSON, выберите raw опция и установите следующие параметры заголовка:

Content-Type: application/json

кроме того, убедитесь, что все строки, используемые в качестве ключей/значений в полезной нагрузке JSON, заключены в двойные кавычки.

The body-parser пакет будет анализировать многострочные raw JSON полезные нагрузки просто отлично.

{
    "foo": "bar"
}

протестировано в Chrome v37 и v41 с расширением Postman v0.8.4.13 (body-parser В1.12.2 и express v4. 12. 3) с настройкой ниже:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

Postman raw json payload

Я сделал очень глупую ошибку и забыл определить name атрибуты для входных данных в моем html-файле.

так вместо

<input type="password" class="form-control" id="password">

у меня есть это.

<input type="password" class="form-control" id="password" name="password">

теперь request.body заполняется так: { password: 'hhiiii' }

я обнаружил, что это работает при отправке с типом контента

"application/json"

в сочетании с серверным

app.use(bodyParser.json());

Теперь я могу отправить через

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

и результат налицо в request.body.name на сервере.

Я столкнулся с этой проблемой сегодня, и что исправлено это было удалить заголовок типа содержимого в почтальона! Очень странный. Добавляя его здесь, если это кому-то поможет.

Я следил за учебником BeerLocker здесь: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

даже когда я изучал узел.js впервые, когда я начал изучать его через веб-приложение, у меня были все эти вещи, сделанные хорошо в моей форме, но я не смог получить значения в запросе post. После долгой отладки, я узнал, что в форме, которую я предоставил enctype="multipart/form-data" из-за чего я не смог получить значения. Я просто удалил его, и это сработало для меня.

аналогичная проблема произошла со мной, я просто смешал порядок параметров обратного вызова. Убедитесь, что вы настраиваете функции обратного вызова в правильном порядке. По крайней мере, для тех, у кого такая же проблема.

router.post('/', function(req, res){});

кажется, если вы не используете какой-либо encType (по умолчанию application/x-www-form-urlencoded) тогда вы получаете поля ввода текста, но вы не получите файл.

если у вас есть форма, в которой вы хотите разместить ввод текста и файл, то используйте multipart/form-data тип кодировки и в дополнение к этому использовать multer промежуточное. Мультер разберет объект запроса и подготовит req.file для вас и всех других полей ввода будут доступны через req.body.

вы должны проверить, правильно ли установлено промежуточное программное обеспечение body-parser для типа запроса(json, urlencoded).

Если вы установили,

app.use(bodyParser.json());

затем в postman вы должны отправить данные как raw.

https://i.stack.imgur.com/k9IdQ.png скриншот почтальона

Если вы установили,

app.use(bodyParser.urlencoded({
    extended: true
}));

затем должна быть выбрана опция 'x-www-form-urlencoded'.

убедитесь, что ["key": "type", "value": "json"] & ["key": "Content-Type","value": "application/x-www-form-urlencoded"] находится в заголовках запроса почтальона

моя проблема была в том, что я сначала создавал маршрут

// ...
router.get('/post/data', myController.postHandler);
// ...

и регистрация промежуточного программного обеспечения после маршрут

app.use(bodyParser.json());
//etc

из-за структуры приложения и копирования и вставки проекта вместе с примерами.

Как только я исправил порядок регистрации промежуточного программного обеспечения перед маршрутом, все это сработало.

Я был с помощью restify выглядит следующим образом вместо того, чтобы выразить и столкнулся с той же проблемой. решение должно было сделать:

сервер.использовать(restify выглядит следующим образом.bodyParser());

я решил это с помощью multer как было предложено выше, но они пропустили полный рабочий пример, о том, как это сделать. В основном это может произойти, когда у вас есть группа форма с enctype="multipart/form-data". Вот HTML для формы, которую я имел:

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

и вот как использовать multer чтобы получить значения и имена этой формы с Express.js и node.js:

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});

вы не должны делать JSON.stringify (данные) при отправке через AJAX, как показано ниже

this is not correct code
    function callAjax(url, data) {
                $.ajax({
                    url: url,
                    type: "POST",
                    data: JSON.stringify(data),
                    success: function(d) {
                        alert("successs "+ JSON.stringify(d));
                    }
                    });
            }   

правильный код

function callAjax(url, data) {
                $.ajax({
                    url: url,
                    type: "POST",
                    data: data,
                    success: function(d) {
                        alert("successs "+ JSON.stringify(d));
                    }
                    });
            }   

Comments

    Ничего не найдено.