Как получить доступ к телу запроса при разноске с помощью узла.js и Экспресс?
у меня есть следующий узел.код 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) но узел.js бросает исключение, говоря"первый аргумент должен быть строкой или буфер "затем переходит к" бесконечному циклу "с исключением, которое говорит"не могу установить заголовки после их отправки."; это также верно, даже если я сделал var reqBody = request.body; и тогда пишу response.write(reqBody).
в чем тут проблема?
кроме того, я могу просто получить исходный запрос без использования express.bodyParser()?
8 ответов:
Экспресс 4.0 и выше:
$ npm install --save body-parserа затем в вашем узле приложения:
const bodyParser = require('body-parser'); app.use(bodyParser);
Express 3.0 и ниже:
попробуйте передать это в своем вызове cURL:
--header "Content-Type: application/json"и убедитесь, что ваши данные в формате JSON:
{"user":"someone"}кроме того, вы можете использовать консоль.реж в вашем узле.JS код для просмотра данных внутри объекта, как в следующем примере:
var express = require('express'); var app = express.createServer(); app.use(express.bodyParser()); app.post('/', function(req, res){ console.dir(req.body); res.send("test"); }); app.listen(3000);этот и другие вопрос также может помочь:как получить JSON в экспресс-узле.JS в POST-запросе?
если вы не хотите использовать bodyParser проверьте этот другой вопрос:https://stackoverflow.com/a/9920700/446681
по состоянию на Express 4, следующий код, кажется, делает трюк. Обратите внимание, что вам нужно будет установить
body-parserС помощьюnpm.var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.listen(8888); app.post('/update', function(req, res) { console.log(req.body); // the posted data });
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) var port = 9000; app.post('/post/data', function(req, res) { console.log('receiving data...'); console.log('body is ',req.body); res.send(req.body); }); // start the server app.listen(port); console.log('Server started! At http://localhost:' + port);Это вам поможет. Я предполагаю, что вы посылаете тело в json.
от экспресс v4. 16, вы можете просто использовать встроенный JSON middleware:
app.use(express.json())такой:
const express = require('express') app.use(express.json()) // <==== parse request body as JSON app.listen(8080) app.post('/test', (req, res) => { res.json({requestBody: req.body}) // <==== req.body will be a parsed JSON object })Примечание -
body-parser, от которого это зависит, это уже включен С экспресс.также не забудьте отправить заголовок
Content-Type: application/json
попробуйте это:
response.write(JSON.stringify(request.body));, которая будет принимать объект, который
bodyParserсоздал для вас и превратить его обратно в строку и записать ее в ответ. Если вам нужно точное тело запроса (с тем же пробелом и т. д.), вам понадобитсяdataиendслушатели, прикрепленные к запросу до и построить строку кусок за куском, как вы можете видеть в JSON разбор исходного кода из connect.
то, что вы утверждаете, что "пробовали делать", - это именно то, что вы написали в коде, который работает "как ожидалось", когда вы вызываете его с помощью curl.
ошибка, которую вы получаете, похоже, не связана ни с одним из кода, который Вы нам показали.
если вы хотите получить необработанный запрос, установить обработчики на
requestнаdataиendсобытия (и, конечно же, удалить любые вызовыexpress.bodyParser()). Обратите внимание, чтоdataсобытия будут происходить кусками, и это если вы не установите кодировка дляdataсобытие эти куски будут буферами, а не строками.
это может быть достигнуто без
body-parserзависимость также, слушайтеrequest:dataиrequest:endи вернуть ответ в конце запроса, см. ниже пример кода. ref:https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyvar express = require('express'); var app = express.createServer(express.logger()); app.post('/', function(request, response) { // push the data to body var body = []; request.on('data', (chunk) => { body.push(chunk); }).on('end', () => { // on end of data, perform necessary action body = Buffer.concat(body).toString(); response.write(request.body.user); response.end(); }); });
вы используете следующий код для регистрации данных post:
router.post("/users",function(req,res){ res.send(JSON.stringify(req.body, null, 4)); });
Comments