source

Express에서 요청 본문을 json이 아닌 일반 텍스트로 강제 해석하려면 어떻게 해야 합니까?

lovecheck 2023. 3. 28. 21:53
반응형

Express에서 요청 본문을 json이 아닌 일반 텍스트로 강제 해석하려면 어떻게 해야 합니까?

nodejs + Express(v3)를 다음과 같이 사용하고 있습니다.

app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

요청 헤더를 확인했는데 content-type이 없습니다."Content-Type"이 "text/plain"인 경우에도 JSON으로 해석됩니다.미들웨어에 항상 본문을 json이 아닌 일반 텍스트 문자열로 해석하도록 지시하는 방법은 없습니까?의 이전 버전req가지고 있었다req.rawBody이 문제를 회피할 수 있지만, 지금은 그렇지 않습니다.Express에서 본문을 일반 텍스트/문자열로 강제 해석하는 가장 쉬운 방법은 무엇입니까?

디폴트bodyParser.text()는 텍스트/문자만 처리합니다.포함할 유형 옵션 변경*/json또는*/*.

app.use('/some/route', bodyParser.text({type: '*/*'}), function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

//or more generally:
app.use(bodyParser.text({type:"*/*"}));

여기서 문서를 찾을 수 있습니다.

express 4.x에서는 bodyParser https://www.npmjs.org/package/body-parser 에서 텍스트파서를 사용할 수 있습니다.

앱 추가만 하면 됩니다.

app.use(bodyParser.text());

원하는 경로에서도

router.all('/',function(req,res){
    console.log(req.body);

})

의 사용을 삭제한 경우bodyParser()미들웨어, 텍스트여야 합니다.를 표시할 수 있습니다.bodyParser자세한 내용은http://http://www.senchalabs.org/connect/middleware-bodyParser.html 를 참조해 주세요.

다음 행을 삭제합니다.

app.use(express.bodyParser());

편집:

당신 말이 맞는 것 같군요.직접 만들 수 있습니다.rawBody그 사이에 미들웨어를 사용하세요.단, 이 경우에도 디세블로 해야 합니다.bodyParser()주의:req.body앞으로도 그럴 것이다undefined.

다음은 데모입니다.

app.module

var express = require('express')
  , http = require('http')
  , path = require('path')
  , util = require('util');

var app = express();

function rawBody(req, res, next) {
  req.setEncoding('utf8');
  req.rawBody = '';
  req.on('data', function(chunk) {
    req.rawBody += chunk;
  });
  req.on('end', function(){
    next();
  });
}

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.use(rawBody);
  //app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
});

app.post('/test', function(req, res) {
  console.log(req.is('text/*'));
  console.log(req.is('json'));
  console.log('RB: ' + req.rawBody);
  console.log('B: ' + JSON.stringify(req.body));
  res.send('got it');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

test.discloss를 실행합니다.discloss 。

var request = require('request');

request({
  method: 'POST',
  uri: 'http://localhost:3000/test',
  body: {'msg': 'secret'},
  json: true
}, function (error, response, body) {
  console.log('code: '+ response.statusCode);
  console.log(body);
})

이게 도움이 됐으면 좋겠다.

본문을 디코딩하는 방법을 내용 유형으로 이해합니다.4.x부터 라이브러리에 내장된 특정 디코더가 미들웨어에 포함되어 있어야 합니다.

app.use(express.text())
app.use(express.json())

이를 달성하기 위해 두 가지 중요한 것이 있습니다.

  1. 본문에서 텍스트를 처리하려면 텍스트 미들웨어를 추가해야 합니다.
  2. 요청에 오른쪽 머리글 "Content-type: text/plain"을 추가하여 콘텐츠 유형을 설정해야 합니다.

여기 둘 다 샘플 코드입니다.

const express = require('express');
const app = express();
const bodyParser = require('body-parser')
//This is the needed text parser middleware 
app.use(bodyParser.text()); 

app.post('/api/health/', (req, res) => {
    res.send(req.body);
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on ${port} ${new Date(Date.now())}`));

이것을 index.js로 저장합니다.

의존 관계를 인스톨 합니다.

npm i -S express 
npm i -S body-parser

실행하다.

node index.js

이제 요청을 보내십시오.

curl -s -XPOST -H "Content-type: text/plain" -d 'Any text or  json or whatever {"key":value}' 'localhost:3000/api/health'

당신이 올린 글을 다시 보내는 것을 볼 수 있을 거예요.

플레인 사용 가능TextParser(https://www.npmjs.com/package/plaintextparser) 미들웨어..

let plainTextParser = require('plainTextParser');
app.use(plainTextParser());

또는

app.post(YOUR_ROUTE, plainTextParser, function(req, res) {             
  let text = req.text;

  //DO SOMETHING....
}); 

해냈다.

router.route('/')
.post(function(req,res){
    var chunk = '';

    req.on('data', function(data){
        chunk += data; // here you get your raw data.
    })        

    req.on('end', function(){

        console.log(chunk); //just show in console
    })
    res.send(null);

})

express 및 bodyParser 버전이 적절한 버전으로 업그레이드되었는지 확인합니다.express 4.x 와 bodyParser 1 1.18.x 로 하면 됩니다.이것을 도입하면, 다음의 기능이 유효하게 됩니다.

app.use(bodyParser.text());

언급URL : https://stackoverflow.com/questions/12345166/how-to-force-parse-request-body-as-plain-text-instead-of-json-in-express

반응형