Node. js 에서 request 모듈 이 Buffer 에 대한 처리 에 대한 상세 한 설명

5169 단어 nodeJS
저 는 작업 과정 에서 request 모듈 을 사용 하여 전단 요청 을 모 의 인터페이스 테스트 를 했 습 니 다. 그러나 buffer 를 테스트 할 때 문제 가 생 겼 습 니 다. 오래 걸 려 서 대량의 자 료 를 찾 아 보 니 바 텀 논리 에 의 해 작 동 되 는 오 룡 이라는 것 을 알 게 되 었 습 니 다.그래서 기록 해서 여러분 께 나 눠 드 리 겠 습 니 다.
우선 request 모듈 을 도입 합 니 다 (NodeJS 가 있다 고 가정 합 니 다).
npm install -s request

또한 백 엔 드 가 필요 합 니 다. express - generator 를 사용 하여 생 성 할 수 있 습 니 다. 참고 하 십시오.https://blog.csdn.net/Z_ammo/article/details/103559758
인터페이스 설정:
app = express();
app.post('/', function(req, res, next) {
  console.log(req.headers);
  let buf = [];
  req.on('data', (data) => {
    buf.push(data);
  });
  req.on('end', () => {
    buf = Buffer.concat(buf);
    console.log(buf.toString());
  });
  res.send('1');
});

현재 발송 요청:
var formData = {
  my_field: 'my_value',
  my_buffer: Buffer.from([1,2,3]) //       request     ,        
};

//post  
request.post({
    url: "http://127.0.0.1:8080/",
    headers: {
        "content-type": "multipart/form-data",
    },
    formData: formData
}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
});

알 겠 습 니 다. 그럼 백 엔 드 에서 받 은 요청 을 살 펴 보 겠 습 니 다.
{
  'content-type': 'multipart/form-data; boundary=--------------------------536170949929771112772934',
  host: '127.0.0.1:3000',
  'content-length': '322',
  connection: 'close'
}
POST / 200 10.093 ms - 1
----------------------------536170949929771112772934
Content-Disposition: form-data; name="my_field"

my_value
----------------------------536170949929771112772934
Content-Disposition: form-data; name="my_buffer"
Content-Type: application/octet-stream


----------------------------536170949929771112772934--

결 과 는 문자열 을 정상적으로 받 았 지만 Buffer 대상 은 표시 되 지 않 았 습 니 다.
나 는 버 퍼 가 자동 으로 블록 을 나 누 는 문제 라 고 생각 했 지만 버 퍼 패 치 를 사용 해도 소 용이 없 었 다. 게다가 여기 서 사용 하 는 것 은 ASCII 코드 로 블록 을 나 누 는 문제 가 없 었 다.
나 는 인 코딩 문제 라 고 의심 했다. 그러나 인 코딩 방식 을 어떻게 수정 하 든 결 과 는 어 지 러 워 서 어 쩔 수 없 이 바 이 너 리 데이터 에서 시작 할 수 밖 에 없 었 다.
JSON. stringify () 인쇄
console.log(JSON.stringify(buf));

결 과 는 다음 과 같다.
{"type":"Buffer","data":[45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,51,49,49,50,55,56,57,53,54,56,57,55,50,49,49,52,57,53,50,53,56,51,55,48,13,10,67,111,110,116,101,110,116,45,68,105,115,112,111,115,105,116,105,111,110,58,32,102,111,114,109,45,100,97,116,97,59,32,110,97,109,101,61,34,109,121,95,102,105,101,108,100,34,13,10,13,10,109,121,95,118,97,108,117,101,13,10,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,51,49,49,50,55,56,57,53,54,56,57,55,50,49,49,52,57,53,50,53,56,51,55,48,13,10,67,111,110,116,101,110,116,45,68,105,115,112,111,115,105,116,105,111,110,58,32,102,111,114,109,45,100,97,116,97,59,32,110,97,109,101,61,34,109,121,95,98,117,102,102,101,114,34,13,10,67,111,110,116,101,110,116,45,84,121,112,101,58,32,97,112,112,108,105,99,97,116,105,111,110,47,111,99,116,101,116,45,115,116,114,101,97,109,13,10,13,10,1,2,3,13,10,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,51,49,49,50,55,56,57,53,54,56,57,55,50,49,49,52,57,53,50,53,56,51,55,48,45,45,13,10]}

먼저 우 리 는 숫자 에 대량의 '45' 구간 이 존재 하 는 것 을 보 았 다. 이것 이 바로 우리 의 '- - - -' 분할 부호 이기 때문에 대체적인 구역 을 확정 할 수 있다.처 리 를 통 해 나 는 어 지 러 운 코드 의 구역 을 다음 과 같이 찾 았 다.
13,10,13,10,1,2,3,13,10

지금 우리 가 검증 해 보 자.
45:-    13: 리 턴    10: 줄 바 꾸 기    1: 제목 시작     2: 본문 시작    3: 본문 끝
그래서 버 퍼 의 내용 은 다음 과 같다.
'리 턴', '줄 바 꾸 기', '리 턴', '줄 바 꾸 기', '제목, 문서 본문, 본문 끝', '리 턴', '줄 바 꾸 기'
그래서 이 버 퍼 는 실제로 빈 문 서 를 전 달 했 습 니 다!모두 '설명 할 수 없 는' 문자 이기 때문에 난 코드 입 니 다.
그럼 파일 의 주 체 는 어디 에 있 습 니까?제 수 조 는 요?
나 는 request 의 공식 문 서 를 보 았 다.https://www.npmjs.com/package/request
원래 request 의 form - data 처리 가 외부 모듈 을 참조 한 것 을 발견 하 였 습 니 다.https://github.com/form-data/form-data
공식 예 시 를 살 펴 보 자.
var form = new FormData();
form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );

axios.post( 'https://example.com/path/to/api',
            form.getBuffer(),
            form.getHeaders()
          )

공식 적 으로 도 간단하게 수 조 를 버 퍼 로 바 꾸 었 고 난 장 판 도 없 었 다.
여기 서 야 나 는 공식 적 으로 16 진수 숫자 를 보 냈 고 내 가 사용 한 예 는 1, 2, 3 을 보 냈 다 는 것 을 깨 달 았 다.
갑자기 생각 나 서 버 퍼 는 배열 의 내용 을 해당 하 는 인 코딩 으로 바 꾸 고 순서대로 연결 합 니 다!
즉, '13, 10, 13, 10, 1, 2, 3, 13, 10' 중의 '1, 2, 3' 은 사실상 우리 가 전달 하 는 배열 매개 변수 이지 파일 내용 이 아니다!
어 지 러 워..
저 는 request 공식 문서 의 예제 에 따라 '[1, 2, 3]' 의 배열 을 사 용 했 습 니 다.
request 공식 문서 에 사용 되 는 샘플 도 너무 자 유 롭 습 니 다.
또한 form - data 모듈 의 공식 문서 알림: Array 대상 을 직접 전달 하지 말고 Array 대상 을 직접 전달 하면 그 내용 을 자동 으로 나 누 어 여러 데이터 블록 으로 나 누 어 전달 합 니 다.

좋은 웹페이지 즐겨찾기