Request: 였λ₯˜: μ†ŒμΌ“ λŠκΉ€

에 λ§Œλ“  2016λ…„ 01μ›” 31일  Β·  77μ½”λ©˜νŠΈ  Β·  좜처: request/request

μ•ˆλ…•ν•˜μ„Έμš”, 그런 λ¬Έμ œκ°€ 이전에 μƒμ„±λœ κ²ƒμœΌλ‘œ μ•Œκ³  μžˆμ§€λ§Œ μ•½κ°„ λ‹€λ₯Έ μ„€λͺ…이 μžˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ μš”μ²­μ„ μˆ˜ν–‰ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€: 양식 데이터 보내기. κ·ΈλŸ¬λ‚˜ μš”μ²­ λͺ¨λ“ˆμ„ μ‚¬μš©ν•  λ•Œ 항상 "μ†ŒμΌ“ 끊기"κ°€ λ°œμƒν•©λ‹ˆλ‹€.

κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 및 κ²°κ³Ό μ•„λž˜

'use strict';

const request = require('request');
const http = require('http');
const querystring = require('querystring');

const data = {
    xstext: 'I have a some problem about node.js server. What should I do to solve the this problem?',
    spintype: 0,
    removeold: 0,
};

// Using request
request(
    {
        method: 'POST',
        url: 'http://address:9017/',
        form: data,
    },
    (error, responce, body) => {
        if (!error) {
            console.log(body, responce);
            return;
        }
        console.log(error);
    }
);

// Using native http
let postData = querystring.stringify(data);

let options = {
    hostname: 'address',
    port: 9017,
    path: '/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length,
    },
};

let req = http.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
});

req.on('error', (e) => {
    console.log(`problem with request: ${e.message}`);
});

req.write(postData);
req.end();

μš”μ²­ λͺ¨λ“ˆμ˜ 경우:

{ [Error: socket hang up] code: 'ECONNRESET' }

λ„€μ΄ν‹°λΈŒ http의 경우:

STATUS: 200
HEADERS: {"content-length":"98","content-type":"text/html","cache-control":"no-cache","connection":"keep-close"}
BODY: Excellent some problem about client. js server. What must i do to solve the particular this issue?
No more data in response.

μš”μ²­ λͺ¨λ“ˆμ˜ 버그인 것 κ°™μŠ΅λ‹ˆλ‹€.

Not enough info (see CONTRIBUTING.md)

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λˆ„κ°€ λ‚  κ΅¬ν•΄μ€˜ :μ—”μ €:

λͺ¨λ“  77 λŒ“κΈ€

λ™μΌν•œ λ¬Έμ œκ°€ μžˆμ§€λ§Œ gzip:true μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ μž‘λ™ν•©λ‹ˆλ‹€.

μ–΄λ–€ λ²„μ „μ˜ node.jsλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? 0.10μ—μ„œ 0.12둜 μ—…κ·Έλ ˆμ΄λ“œν•œ ν›„ 가끔 ECONNRESET μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€. node.js 버그λ₯Ό νŒŒν—€μ³ 보면 이것이 0.12μ—μ„œ κΉ¨μ Έ λ‚˜μ€‘μ— μˆ˜μ •λœ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œλ„ 같은 λ¬Έμ œμž…λ‹ˆλ‹€. μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? node.js 4.2.2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ”λ° 주기적(λΆ„λ‹Ή 3-4회) ECONNRESET 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @aymeba λŠ” 이 μˆ˜μ • 사항이 μžˆλŠ” 첫 번째 4.x 버전이 4.4.0인 것 κ°™μŠ΅λ‹ˆλ‹€.

http: handle errors on idle sockets λΌλŠ” 컀밋을 μ°ΎμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λΈŒλžœμΉ˜μ— μ μš©λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이 제λͺ©μ—λŠ” λ‹€μ–‘ν•œ 컀밋이 μžˆμŠ΅λ‹ˆλ‹€.

신경쓰지 λ§ˆμ„Έμš”. ν˜Όλž€μŠ€λŸ¬μ›Œμ„œ node.js의 ECONNRESET 버그에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€(#3595).

μ§€μ ν•˜μ‹  버그 λ•Œλ¬Έμ— 그런 일이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 우리의 경우 λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

  • λ°±μ—”λ“œμ— μš”μ²­ 보내기
  • λ°±μ—”λ“œκ°€ μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • μ–΄λ–»κ²Œ λ“  μš”μ²­μ΄ 응닡을 기닀리지 μ•Šκ³  연결이 λŠμ–΄μ§€κ³  ECONNRESET이 λ°œμƒν•©λ‹ˆλ‹€.
  • λ°±μ—”λ“œ μ„œλ²„κ°€ 연결을 λŠμ§€ μ•ŠλŠ”λ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€.

일반적인 경우 λ°±μ—”λ“œ μ„œλ²„μ—μ„œ 이 였λ₯˜λ₯Ό λ°œμƒμ‹œμΌœμ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 이 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것이 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? botkit 0.2.1μ—μ„œ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ μ‹œκ°„ λ™μ•ˆ 연ꡬ, ν…ŒμŠ€νŠΈ 및 디버깅을 μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” Postman을 톡해 λ™μΌν•œ restapi에 κ²Œμ‹œν•˜λŠ” 것이 끝점이 잘 μž‘λ™ν•©λ‹ˆλ‹€. κΈ°λ³Έ NodeJS http.request ν˜ΈμΆœμ„ ν†΅ν•œ μš”μ²­μ΄ μ‹€νŒ¨ν•©λ‹ˆλ‹€. λͺ¨λ“  헀더와 νŽ˜μ΄λ‘œλ“œ(λ³Έλ¬Έ)λŠ” λ™μΌν•©λ‹ˆλ‹€. (헀더에 우편 배달뢀 토큰이 μ—†λŠ” 경우 μ œμ™Έ)

전체 곡개, λ‚˜λŠ” λ‚΄ μ„œλ²„μ— restifyλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ„œλ²„ μΈ‘μ—μ„œ restifyλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 κ°μ‚¬μžλ₯Ό ν™œμ„±ν™”ν•˜λŠ” 데 도움이 될 κ²ƒμž…λ‹ˆλ‹€. κ°μ‚¬μžλŠ” 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€μ— λŒ€ν•œ 힌트λ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ μ„œλ²„κ°€ μ˜ˆμƒν•  λ‚΄μš©μ„ μ•Œ 수 μžˆλ„λ‘ μš”μ²­μ—μ„œ μ˜¬λ°”λ₯Έ "Content-Type"을 μ„€μ •ν–ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€. μ„œλ²„κ°€ μš”μ²­μ„ μ˜€ν•΄ν•  λ•Œ 이 였λ₯˜λ₯Ό λ³΄μ•˜μœΌλ―€λ‘œ μ½˜ν…μΈ  μœ ν˜•μ„ μ œκ³΅ν•˜λ©΄ 도움이 λ©λ‹ˆλ‹€.

이 λ¬Έμ œμ— λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? Node v5.0.0μ—μ„œ 이 λ¬Έμ œκ°€ 계속 λ°œμƒν•©λ‹ˆλ‹€. μš”μ²­μ΄ 이루어진 ν›„ μ •ν™•νžˆ 45초 후에 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” HapiJSμ—μ„œ 이와 λ™μΌν•œ 문제λ₯Ό λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” 잘λͺ»λœ μ½˜ν…μΈ  길이 ν—€λ”μ˜€μŠ΅λ‹ˆλ‹€.

ꡬ독과 μ•Œλ¦Ό 신청을 ν•˜κ³  싢은데... κ°μ‚¬ν•©λ‹ˆλ‹€.

λ…Έλ“œ v6.9.2μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.

  get: async function(ctx) {
    let body = await new Promise(function(resolve, reject) {
      return ctx.req.pipe(request('/path/to/my/backend', function(err, res, body) {
        if (err) { return reject(err) }
        resolve(body)
      }))
    })
    return body
  }

λ…Έλ“œ 6.6.0μ—μ„œλ„ 이것을 보고 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ—°κ²°ν•˜λŠ” μ„œλ²„λŠ” μ‘λ‹΅μ—μ„œ Content-Length 헀더λ₯Ό 보내지 μ•ŠμŠ΅λ‹ˆλ‹€. 이 경우 HTTP 사양에 따라 μ„œλ²„λŠ” λͺ¨λ“  데이터λ₯Ό 보낸 ν›„ μŠ€νŠΈλ¦Όμ„ λ‹«μ•„μ•Ό ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μ†ŒμΌ“ λŠκΉ€μœΌλ‘œ 잘λͺ» ν•΄μ„λ˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. cURL둜 λ™μΌν•œ μš”μ²­μ„ ν•˜λ©΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

+1
λ…Έλ“œ 6.9.4
μš”μ²­ 2.79.0

컬과 잘 μ–΄μšΈλ¦½λ‹ˆλ‹€.
λ‚΄κ°€ μ–»μœΌλ €κ³ ν•˜λŠ” URL은 헀더 Content-Lengthλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

+1
λ…Έλ“œ 6.9.1
μš”μ²­ 2.79.0

Wget, curl - 성곡, κ·ΈλŸ¬λ‚˜ μš”μ²­ - 였λ₯˜.

λ…Έλ“œ - v6.9.4
μš”μ²­ - 2.79.0

# node req.js
REQUEST { uri: 'http://wtfismyip.com', callback: [Function] }
REQUEST make request http://wtfismyip.com/

{ Error: socket hang up
    at createHangUpError (_http_client.js:254:15)
    at Socket.socketOnEnd (_http_client.js:346:23)
    at emitNone (events.js:91:20)
    at Socket.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9) code: 'ECONNRESET' }

같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν₯λ―Έλ‘­κ²Œλ„ 6.4.0μ—μ„œλŠ” λ™μΌν•œ μ½”λ“œκ°€ μž‘λ™ν•˜μ§€λ§Œ 6.9.2μ—μ„œλŠ” μ€‘λ‹¨λ˜λ―€λ‘œ μš”μ²­ 버전과 λ¬΄κ΄€ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€(이것은 λ‚΄κ°€ μ„€μΉ˜ν•œ 2개의 nodejs 버전일 λΏμž…λ‹ˆλ‹€).

제 κ²½μš°μ—λŠ” Connection: keep-alive 헀더λ₯Ό μ„€μ •ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

@dieseldjango μ œμ•ˆ κ°μ‚¬ν•©λ‹ˆλ‹€. κ·Έλž˜λ„ λ‚΄ 사건을 ν•΄κ²°ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μž¬μƒμ‚°μ„ μœ„ν•΄ 이 였λ₯˜λ₯Ό μ œκ³΅ν•˜λŠ” μ‚¬μ΄νŠΈμž…λ‹ˆλ‹€.

{ request: 
   { debugId: 1,
     uri: 'https://www.deal.no/',
     method: 'GET',
     headers: 
      { Connection: 'keep-alive',
        host: 'www.deal.no',
        'accept-encoding': 'gzip, deflate' } } }
error:  Error: socket hang up
    at TLSSocket.onHangUp (_tls_wrap.js:1111:19)
    at TLSSocket.g (events.js:291:16)
    at emitNone (events.js:91:20)
    at TLSSocket.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

..μ „μ†‘λœ 헀더 디버깅을 μœ„ν•΄

이거 아직 ν•΄κ²°λ˜μ§€ μ•Šμ•˜λ‚˜μš”? 2μ£Ό μ „μ—λŠ” 잘 μž‘λ™ν–ˆλŠ”λ° 이제 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
{ [Error: socket hang up] code: 'ECONNRESET', response: undefined }
λ…Έλ“œ -v 4.4.7

ν—€λ”μ—μ„œ 'accept-encoding': 'gzip, deflate'λ₯Ό μ œκ±°ν•˜λ©΄ 이 λ¬Έμ œκ°€ ν•΄κ²°λ©λ‹ˆλ‹€.

μ‚¬λžŒλ“€μ΄ 이 였λ₯˜λ₯Ό 더 자주 λ°›λŠ” 것을 λ΄…λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” 정말 κ°„λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ λ‚œ λ‚΄ μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ₯Ό 기반으둜 μ œλŒ€λ‘œ ν˜•μ„± URL 무엇인지, μ‹€μ œλ‘œ, λΆ€μ •ν–ˆλ‹€. 이 문제λ₯Ό κ²ͺκ³  μžˆλŠ” λͺ¨λ“  μ‚¬μš©μžκ°€ μ½”λ“œμ— λ¬Έμ œκ°€ μžˆλ‹€κ³  κ°€μ •ν•  것을 ꢌμž₯ν•©λ‹ˆλ‹€. 98%의 경우 κ·Όλ³Έ 원인은 λ‹Ήμ—°ν•˜κ²Œ μ—¬κΈ°κ±°λ‚˜ κ°„κ³Όν•˜κ³  μžˆλŠ” 일상적인 κ²ƒμž…λ‹ˆλ‹€. 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μœ„μ˜ λͺ¨λ“  것을 μ‹œλ„ν–ˆμ§€λ§Œ κ²°κ΅­ μΆ”κ°€ μŠ¬λž˜μ‹œλ‘œ κ·€κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 당신이 λ§ν•˜λŠ” λͺ¨λ“  μ œμ•ˆμ„ λ”°λ₯΄λ €κ³  λ…Έλ ₯ν•˜μ§€λ§Œ 이 λ¬Έμ œλŠ” μ—¬μ „νžˆ λ°œμƒν•©λ‹ˆλ‹€. λ„ˆλ¬΄ 슬퍼....

λˆ„κ΅°κ°€μ—κ²Œ 도움이 λœλ‹€λ©΄ κ²°κ΅­ require('child_process').execλ₯Ό μ‚¬μš©ν•˜μ—¬ curl을 ν˜ΈμΆœν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ˜μ—­μ—μ„œ μ˜€λŠ” 경우 μž…λ ₯을 μ μ ˆν•˜κ²Œ μ‚­μ œν•΄μ•Ό ν•©λ‹ˆλ‹€.

google.com => 호슀트 이름: 'google.com'에 μš”μ²­ν•˜μ—¬ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.
제 κ²½μš°μ—λŠ” "호슀트 이름"이 nginxμ—μ„œ ν”„λ‘μ‹œλ‘œ μ²˜λ¦¬λ˜μ—ˆμœΌλ©° 본문이 λΉ„μ–΄ μžˆλŠ” μš”μ²­μ„ μˆ˜μ‹ ν•  λ•Œ μ‘λ‹΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
이 μ½”λ“œλŠ” 였λ₯˜λ₯Ό μ–»μŠ΅λ‹ˆλ‹€.

var http = require("http");
var options = {
  hostname: 'myAddressNginx',
  port: 80,
  path: '/',
  method: 'GET',
  headers: {
    'Content-Type': 'text/html',
    'Content-Length': Buffer.byteLength("")
  }
};

var req = http.request(options, (res) => {
  res.on('data', (chunk) => {console.log("%s", chunk);});
  res.on('end', () => {});
});

// write data to request body
req.write("");
req.end();

이 μ½”λ“œλŠ” μž‘λ™ν•©λ‹ˆλ‹€

var http = require("http");
var options = {
  hostname: 'myAddressNginx',
  port: 80,
  path: '/',
  method: 'GET',
  headers: {
    'Content-Type': 'text/html',
    'Content-Length': Buffer.byteLength("")
  }
};

var req = http.request(options, (res) => {
  res.on('data', (chunk) => {console.log("%s", chunk);});
  res.on('end', () => {});
});

// write data to request body
req.write("abc");
req.end();

+1
λ…Έλ“œ 6.9.5

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, 저도 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. +1
λ‹€ν–‰νžˆ 두 번째 λͺ¨λ‹ˆν„°λ§ 도ꡬ λ‚΄μ—μ„œ 'μš”μ²­'을 μ‚¬μš©ν•˜λ―€λ‘œ λ¬Έμ œκ°€ μ΅œμ†Œν™”λ©λ‹ˆλ‹€. λ‚˜λŠ” node.jsλ₯Ό 많이 μ’‹μ•„ν•΄μ„œ λͺ‡ 가지 ν”Όλ“œλ°±μ„ κ²Œμ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 제 ν”Όλ“œλ°±μ΄ 문제λ₯Ό ν•΄κ²°ν•˜λ €λŠ” μ‹œλ„μ— μ‘°κΈˆμ΄λ‚˜λ§ˆ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

이제 νŠΈλž˜ν”½μ΄ λ§Žμ€ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ 였λ₯˜κ°€ μΌκ΄€λ˜κ²Œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
μ„œλ²„μ˜ "μ •ν™•ν•œ" λ³΅μ œλ³Έμ„ μŠ€ν•€μ—…ν•  수 있으며 "μ ˆλŒ€" 였λ₯˜κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. 끝점을 μ „ν™˜ν•  수 있으며 항상 νŠΈλž˜ν”½μ΄ λ§Žμ€ ν”„λ‘œλ•μ…˜ ν™˜κ²½μœΌλ‘œ 인해 ν΄λΌμ΄μ–ΈνŠΈμ— 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
{ [였λ₯˜: μ†ŒμΌ“ λŠκΉ€] μ½”λ“œ: 'ECONNRESET' }.

λͺ‡μΌμ „λΆ€ν„° 간헐적인 μ—λŸ¬λ‘œ μ‹œμž‘ν•΄μ„œ λͺ¨λ‹ˆν„°λ§ μ„œλΉ„μŠ€ κ±°μ§“μ•ŒλžŒμ΄ λ„ˆλ¬΄ μ—¬λŸ¬λ²ˆ 였고..... 그리고 'μš”μ²­'을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œλ•μ…˜ ν…ŒμŠ€νŠΈ 툴둜 ν…ŒμŠ€νŠΈλ₯Ό 정말 많이 ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 이 문제λ₯Ό 찾으렀면 웹을 κ²€μƒ‰ν•˜μ‹­μ‹œμ˜€.

이제 이 μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•΄ 8κ°œμ›” 이상 μ½”λ“œ/버전을 λ³€κ²½ν•˜μ§€ μ•Šμ•˜μœΌλ©° 이것이 μ–΄λ–»κ²Œ μ•„λ¬΄λ°μ„œλ‚˜ λ°œμƒν•  수 μžˆλŠ”μ§€ ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ... ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄ 'μš”μ²­' μ„Έκ³„μ—μ„œ 무엇이 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

+1
λ…Έλ“œ 6.9.1

이것은 가끔 λ‘œμ»¬μ—μ„œ λ‚΄ μ—”λ“œν¬μΈνŠΈλ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  λ§Žμ€ μš”μ²­μ„ λ‹€μ†Œ λΉ λ₯Έ λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€...

μš°λ¦¬λŠ” λ˜ν•œ node4와 node6μ—μ„œλ„ 같은 λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. node0.12μ—μ„œ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 도움을 μ£Όμ„Έμš”.

κΈ°λ³Έ https.request 문제의 μœ μ‚¬ν•œ 문제
μ—¬κΈ° μ—μ„œ 더 보기,

μ˜΅μ…˜μ„ μš”μ²­ν•˜λ €λ©΄ μ•„λž˜μ— μΆ”κ°€ν•˜λ©΄ 이 문제λ₯Ό 우회(μˆ˜μ •)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

agentOptions: {
  ciphers: 'DES-CBC3-SHA'
}

λ‚˜λŠ” λ”°λΌμž‘ν˜€ μ˜€ν›„ λ‚΄λ‚΄ 그것을 μ•Œμ•„λ‚΄λ €κ³  λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€... μ—¬λŸ¬ κ³„μΈ΅μ˜ λ¦¬λ””λ ‰μ…˜μ΄ μžˆλŠ” λ³΅μž‘ν•œ ν™˜κ²½μ— μžˆμ—ˆμŠ΅λ‹ˆλ‹€. is this DNS issue? -> no way it's DNS -> definitely DNS -> no it's not
@fractalf 의 예λ₯Ό 보고 이 λͺ¨λ“  것이 httpsλ₯Ό μ‚¬μš©ν•˜λŠ” IIS6μ—μ„œ ν˜ΈμŠ€νŒ…λ˜λŠ” μ‚¬μ΄νŠΈμ—μ„œλ§Œ λ°œμƒν•œλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.

뢈운.

λ‹€μŒμœΌλ‘œ μ•”ν˜Έλ₯Ό 섀정해도 νš¨κ³Όκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
μ—μ΄μ „νŠΈ μ˜΅μ…˜: {
μ•”ν˜Έ: 'DES-CBC3-SHA'
}

@aganapan μš”μ²­ν•œ URL이 λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ‚΄ μ†”λ£¨μ…˜μ€ IIS6 + TLS1.0μ—μ„œ ν˜ΈμŠ€νŒ…ν•˜λŠ” μ›Ή μ‚¬μ΄νŠΈμ™€ κ΄€λ ¨λœ 문제만 μˆ˜μ •ν•©λ‹ˆλ‹€. μœ μ‚¬ν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ°œμƒμ‹œν‚€λŠ” λ‹€λ₯Έ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. λ‚˜λŠ” ngrok을 μ‚¬μš©ν•˜κ³  RAW μš”μ²­μ„ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μž…λ ₯에 인쇄할 수 μ—†λŠ” e2808b λ¬Έμžκ°€ μΆ”κ°€λœ κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„ 볡사/λΆ™μ—¬λ„£κΈ° ν•©λ‹ˆλ‹€. λ‚˜λŠ” κ·Έ μ‚¬μš©μžκ°€ μ œκ³΅ν•œ URI 뢀뢄에 encodeURIComponent() λ₯Ό μ‚¬μš©ν–ˆκ³  λ¬Έμ œλŠ” μ‚¬λΌμ‘Œλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.

  • λ…Έλ“œ V6.9.5
  • V2.69.0 μš”μ²­

@danielkhan encodeURIComponent 방법을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

// this is request
{
    "request": {
        "debugId": 5,
        "uri": "https://xxx.cdn.cn/js/information_main_27d1838a.js",
        "method": "GET",
        "headers": {
            "user-agent": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
            "host": "xxx.cdn.cn"
        }
    }
}

{
    "response": {
        "debugId": 5,
        "headers": {
            "expires": "Sat, 15 Apr 2017 11:01:16 GMT",
            "date": "Thu, 16 Mar 2017 11:01:16 GMT",
            "content-type": "application/x-javascript; charset=utf-8",
            "content-length": "49785",
            "last-modified": "Sun, 12 Mar 2017 14:30:49 GMT",
            "cache-control": "max-age=2592000",
            "access-control-allow-origin": "*",
            "accept-ranges": "bytes",
            "age": "19",
            "x-cache": "HIT from www.matocloud.com",
            "connection": "close",
            "alt-svc": "h2=\":443\""
        },
        "statusCode": 200
    }
}

Node.js 6.10.0
μš”μ²­ 2.72.0

일뢀 λ°±μ—”λ“œ 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ λ™μΌν•œ 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 당사 μ œν’ˆμ€ HTTPSλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ λ„€νŠΈμ›Œν¬ μž₯μΉ˜μ— μ—°κ²°ν•©λ‹ˆλ‹€. 이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” μ—¬λŸ¬ HTTPS 연결을 μ„€μ •ν•˜κ³  각 μž₯μΉ˜μ— λŒ€ν•΄ 일뢀 POST 및 GET μš”μ²­μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ— ν•΄κ²° 방법은 HTTP 영ꡬ 연결을 λΉ„ν™œμ„±ν™”ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€(HTTP 헀더 Connection: close ). μ΄λ ‡κ²Œ ν•˜μ—¬ 응닡(HTTP/1.1)을 μ „λ‹¬ν•œ ν›„ 연결을 μ’…λ£Œν•˜λ„λ‘ μ„œλ²„μ— μš”μ²­ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이제 각 TCPκ°€ ν•˜λ‚˜μ˜ μš”μ²­λ§Œ μ²˜λ¦¬ν•˜λ―€λ‘œ HTTP 영ꡬ μ—°κ²°μ˜ 이점을 μžƒκ²Œ λ©λ‹ˆλ‹€.

크둬이 이 DES-CBC3-SHA μ†”λ£¨μ…˜μ„ μ°¨λ‹¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λ₯Ό μœ„ν•΄ 컬이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 전에 λ‚΄ λͺ…령쀄 도ꡬ에 ν”„λ‘μ‹œλ₯Ό μ„€μ •ν•œ 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 이제 ν”„λ‘μ‹œλ₯Ό μ œκ±°ν•˜λ©΄ 잘 μž‘λ™ν•©λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ 계속 λ°œμƒν•©λ‹ˆλ‹€.

{ Error: socket hang up
 at createHangUpError (_http_client.js:302:15)
 at Socket.socketOnEnd (_http_client.js:394:23)
 at emitNone (events.js:91:20)
 at Socket.emit (events.js:186:7)
 at endReadableNT (_stream_readable.js:974:12)
 at _combinedTickCallback (internal/process/next_tick.js:74:11)
 at process._tickDomainCallback (internal/process/next_tick.js:122:9) code: 'ECONNRESET' }

λ§ˆμΉ¨λ‚΄ 이것이 recaptcha에 λŒ€ν•΄ μž‘λ™ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€. https 라이브러리λ₯Ό 가져와 μ‚¬μš©ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. μž‘μ—… μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

var https = μš”κ΅¬('https');
var 쿼리 λ¬Έμžμ—΄ = μš”κ΅¬('쿼리 λ¬Έμžμ—΄');

var λΉ„λ°€ = "YOUR_KEY";
var 응닡 = RESPONSE_CODE;
var postData = "λΉ„λ°€="+λΉ„λ°€+"&"+"응닡="+ 응닡;

// κ°μ²΄μ—μ„œ 포슀트 λ¬Έμžμ—΄μ„ λΉŒλ“œν•©λ‹ˆλ‹€.
var post_data = querystring.stringify({
'컴파일_레벨': 'ADVANCED_OPTIMIZATIONS',
'좜λ ₯ ν˜•μ‹': 'json',
'좜λ ₯ 정보': '컴파일된 μ½”λ“œ',
'warning_level': '쑰용히',
'js_code': postData
});

λ³€μˆ˜ μ˜΅μ…˜ = {
호슀트 이름: ' www.google.com ',
포트: 443,
경둜: '/recaptcha/api/siteverify',
λ©”μ†Œλ“œ: 'POST',
헀더: {
'μ½˜ν…μΈ  μœ ν˜•': 'μ‘μš© ν”„λ‘œκ·Έλž¨/x-www-form-urlencoded'
//'μ½˜ν…μΈ  인코딩': 'gzip',
//'μ—°κ²°': 'λ‹«κΈ°'
},
μ—μ΄μ „νŠΈ μ˜΅μ…˜: {
μ•”ν˜Έ: 'DES-CBC3-SHA'
}
};
var μš”μ²­ = https.request(μ˜΅μ…˜, κΈ°λŠ₯(res) {
console.log('μƒνƒœ: ' + res.statusCode);
console.log('헀더: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('데이터', ν•¨μˆ˜(λ³Έλ¬Έ) {
console.log('λ³Έλ¬Έ: ' + λ³Έλ¬Έ);
});
});
req.on('였λ₯˜', function(e) {
console.log('μš”μ²­ 문제: ' + e.message);
});
// μš”μ²­ 본문에 데이터 μ“°κΈ°
req.write(postData);
μš”κ΅¬μ‚¬ν•­ μ’…λ£Œ();

μ°Έκ³ : νŠΉμ • 였λ₯˜ λ©”μ‹œμ§€μ— λŒ€ν•΄ 인터넷을 검색할 λ•Œ 이 토둠을 μš°μ—°νžˆ 보게 될 λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ μœ„ν•΄ 이것을 κΈ°λ‘ν•˜μ‹­μ‹œμ˜€.

μœ„μ˜ λ…Όμ˜μ˜ λŒ€λΆ€λΆ„μ€ μš”μ μ„ λ†“μΉ˜κ³  μžˆλŠ” κ²ƒμœΌλ‘œ 판λͺ…λ˜μ—ˆμœΌλ―€λ‘œ 였λ₯˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄νŠΈμ—μ„œ λ°œμƒ ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ request λŒ€ν•΄ λ‹€λ₯Έ "ν•΄κ²° 방법"을 μ‹œλ„ν•˜λ©΄ μž‘λ™ν•˜μ§€ μ•Šμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€. λ¬Έμ œλŠ” μ„œλ²„ μΈ‘ 의 HTTP μš”μ²­ μ†ŒμΌ“μ΄ λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ˜ κΈ΄ μ§€μ—°μœΌλ‘œ 인해 유휴 μ‹œκ°„ 초과둜 μ‹€ν–‰λœ λ‹€μŒ μ†ŒμΌ“μ„ λ‹«λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·Έ κ²°κ³Ό ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ ECONNRESET이 λ°œμƒν•©λ‹ˆλ‹€.

μ„œλ²„ μΈ‘ μ†ŒμŠ€ μ½”λ“œλ„ λ‹΄λ‹Ήν•˜κ³  express/koa ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 였래 μ§€μ†λ˜λŠ” λ°±μ—”λ“œ μž‘μ—…μ„ μ‹œμž‘ν•˜κΈ° 전에 HTTP μš”μ²­ μ†ŒμΌ“μ—μ„œ 유휴 μ‹œκ°„ μ œν•œμ„ λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ ES6 koa 라우트 ν•Έλ“€λŸ¬μ˜ 경우:

javascript ctx => { .... ctx.socket.setTimeout(0); // now trigger the long lasting backend operation .... }

이제 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ 쀄을 λ³€κ²½ ν•˜μ§€ μ•Šκ³  ν΄λΌμ΄μ–ΈνŠΈ μ‹œκ°„ 초과 λ¬Έμ œκ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€...

μ˜¬λ°”λ₯Έ SSL(https λ˜λŠ” http)둜 URL을 ν˜ΈμΆœν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

제 κ²½μš°μ—λ„ ν”„λ‘μ‹œ λ¬Έμ œμž…λ‹ˆλ‹€. http_proxy 및 https_proxyλ₯Ό μž¬μ„€μ •ν•˜λ©΄ λ¬Έμ œκ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.

컬의 경우:
HTTP/1.1 200 OK

κΈ°λ³Έ http λͺ¨λ“ˆμ˜ 경우:
{ [Error: socket hang up] code: 'ECONNRESET' }

μš”μ²­ λͺ¨λ“ˆμ˜ 경우:
{ [Error: socket hang up] code: 'ECONNRESET' }

κ·Έ μ΄μœ λŠ” 특히 http ν”„λ‘œν† μ½œμ˜ 잘λͺ»λœ ꡬ문에 λŒ€ν•œ μ‘λ‹΅μ΄μ—ˆμŠ΅λ‹ˆλ‹€.
\n κΈ°ν˜ΈλŠ” λͺ¨λ“  헀더 뒀에 μžˆμ—ˆμ§€λ§Œ \r\n μ—¬μ•Ό ν•˜κ³  λ§ˆμ§€λ§‰ 헀더 λ‹€μŒμ— - \r\n\r\n .

μˆ˜μ •ν•˜λ‹ˆ 였λ₯˜κ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€.

λˆ„κ΅°κ°€μ—κ²ŒλŠ” μœ μš©ν•˜κ³  μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. 제 κ²½μš°μ—λŠ” μš”μ²­ μ˜΅μ…˜μ˜ 헀더에 User-Agentλ₯Ό μ„€μ •ν–ˆλŠ”λ° λ¬Έμ œκ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€.

Node 8.x와 λ™μΌν•œ λ¬Έμ œκ°€ 있음

+1
λ…Έλ“œ 8.1.2
"μš”μ²­": "=2.81.0"

{
    "method": "GET",
    "json": true,
    "uri": "http://www.bb.com/xxxxxxxxxxx",
    "baseUrl": null,
    "headers": {
        "cookie": "yyyyy",
        "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60"
    },
    "qs": {
        "app_version": "1.9.8.8",
        "env": "prod"
    }
}

//res
Error: socket hang up
InternalServerError: Internal Server Error

// setting
var _request = require('request').defaults({
        forever      : true,
        maxRedirects : 8
    }),

λ‚˜λŠ” 같은 였λ₯˜κ°€ λ°œμƒν–ˆμ§€λ§Œ 쑰금 λ‹€λ₯Έ, λ‚΄ 상황은 μ΄λ ‡μŠ΅λ‹ˆλ‹€.
testapp -> api A -> api B
-> μš”μ²­μ„ 의미
ν…ŒμŠ€νŠΈ 앱은 Aκ°€ Bλ₯Ό 맀우 느리게 μš”μ²­ν•˜λ©΄ λŠκΉ€ 였λ₯˜κ°€ λ°œμƒν•˜κ³  λ§ˆμΉ¨λ‚΄ Bλ‘œλΆ€ν„° 500 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€(였λ₯˜λŠ” API Aμ—μ„œ 처리됨).
api Aκ°€ λ§Žμ€ 일을 ν•˜κ³  항상 응닡을 맀우 느리게 λ°˜ν™˜ν•˜μ§€λ§Œ 였λ₯˜λŠ” μ—†κΈ° λ•Œλ¬Έμ— μ‹œκ°„ 초과 λ¬Έμ œκ°€ μ•„λ‹ˆλΌκ³  ν™•μ‹ ν•©λ‹ˆλ‹€.
이제 λ‚˜λŠ” ν‘œν˜„κ³Ό μš”μ²­μ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ •λ§λ‘œ ν˜Όλž€μŠ€λŸ¬μ›Œν•©λ‹ˆλ‹€. 500 였λ₯˜λŠ” 이미 api A에 μ˜ν•΄ 처리되고 λ‹€λ₯Έ μ‘°μΉ˜κ°€ 후속 쑰치λ₯Ό μ·¨ν•©λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ μ•±μ—μ„œ μ—¬μ „νžˆ μ†ŒμΌ“ λŠκΉ€ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μ΅œμ‹  λ…Έλ“œ(8.6)와 μ΅œμ‹  7.x λ¦΄λ¦¬μŠ€μ—μ„œλ„ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ 그것을 μ°”λŸ¬λ³΄κ³  μ‹Άλ‹€λ©΄ μ„ΈλΆ€ 정보가 여기에 μžˆμŠ΅λ‹ˆλ‹€. https://stackoverflow.com/questions/46666079/node-js-http-get-econnreset-error-on-read

μΆ”κ°€ 정보λ₯Ό μ œκ³΅ν•  수 있으면 μ•Œλ €μ£Όμ„Έμš”!

λ…Έλ“œ 6.10.0κ³Ό λ™μΌν•œ λ¬Έμ œκ°€ 있음

또 λ‹€λ₯Έ κ°€λŠ₯ν•œ μ„€λͺ…: Content-Length 헀더에 μ§€μ •λœ 것보닀 HTTP 본문에 더 λ§Žμ€ 데이터λ₯Ό 보내고 μžˆμŠ΅λ‹ˆλ‹€.

+1
λ…Έλ“œ 8.6.0

문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.
1-process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"을 μΆ”κ°€ν•©λ‹ˆλ‹€.
2-zone.jsλ₯Ό v0.7.4둜 μ—…κ·Έλ ˆμ΄λ“œ

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆκ³  ν•΄κ²° 방법은 ν™˜κ²½ λ³€μˆ˜ NO_PROXY="yourcompany.com" κ³Ό strictSSL:false λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 우리의 μš”μ²­μ΄ λ‚΄λΆ€ νšŒμ‚¬ URL에 λŒ€ν•΄ 이루어지고 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λ €κ³ 

+1
λ…Έλ“œ 8.8.1

at createHangUpError (_http_client.js:329:15)
at Socket.socketOnEnd (_http_client.js:421:23)
at emitNone (events.js:110:20)
at Socket.emit (events.js:207:7)
at endReadableNT (_stream_readable.js:1056:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9) code: 'ECONNRESET' }

λ‚΄ μͺ½μ˜ λ¬Έμ œλŠ” Vagrantκ°€ 포트λ₯Ό "점유"ν•˜κ³  λ‚΄ GET μš”μ²­ 직후에 FIN ν”Œλž˜κ·Έκ°€ ν¬ν•¨λœ TCP νŒ¨ν‚·μ„ λ³΄λ‚΄λŠ” κ²ƒμ΄μ—ˆμ§€λ§Œ chromeκ³Ό postman이 μ™œ λ¬Έμ œκ°€ μ—†μ—ˆλŠ”μ§€ 아직 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ - μ•„λ§ˆλ„ 그듀은 μ•½κ°„μ˜ 회볡λ ₯을 가지고 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ”μ΄ λ¬Έμ œκ°€ μžˆμ—ˆκ³  GZIP이 켜져 μžˆμ—ˆκ³  Keep Alive도 μΌœμ Έμžˆμ—ˆμŠ΅λ‹ˆλ‹€.
νŒ¨ν‚€μ§€λ₯Ό μΆ”κ°€ν•œ ν›„ λ¬Έμ œκ°€ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€.

const zlib = require('zlib'); // for GZIP
const http = require('http');
const https = require('https');

λ™μΌν•œ 문제 - 참고용으둜 localhostμ—μ„œ 호슀트 μ‹œμŠ€ν…œμ˜ μ‹€μ œ IP둜 URL을 λ³€κ²½ν•˜μ—¬ μˆ˜μ •λ¨

μ—¬μ „νžˆ 이 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. λšœλ ·ν•œ μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€.

info:  Error: socket hang up
    at createHangUpError (_http_client.js:345:15)
    at Socket.socketOnEnd (_http_client.js:437:23)
    at emitNone (events.js:110:20)
    at Socket.emit (events.js:207:7)
    at endReadableNT (_stream_readable.js:1059:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)

μ•ˆλ…•ν•˜μ„Έμš”, 아직 이 문제λ₯Ό ν•΄κ²°ν–ˆλŠ”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ μ €λŠ” 이 todyλ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. 디버깅할 λ•Œ,

// Using native http
let postData = querystring.stringify(data);
...
req.write(postData);

원격 μ„œλ²„κ°€ koa(λ˜λŠ” λ‹€λ₯Έ nodejs μ„œλ²„)에 μ˜ν•΄ μ‹œμž‘λ˜κ³  데이터가 {} 인 경우 postData by stringify ν•¨μˆ˜λŠ” {} 둜 λ³€ν™˜ν•˜μ§€λ§Œ koa μ„œλ²„λŠ” {} λŠ” parser error λ₯Ό 던질 κ²ƒμ΄λ―€λ‘œ 이 μš”μ²­μ€ 였λ₯˜λ₯Ό 던질 κ²ƒμž…λ‹ˆλ‹€.

Error: socket hang up
    at createHangUpError (_http_client.js:345:15)
    at Socket.socketOnEnd (_http_client.js:437:23)
    at emitNone (events.js:110:20)
    at Socket.emit (events.js:207:7)
    at endReadableNT (_stream_readable.js:1059:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)

κ·Έλž˜μ„œ λ‚˜λŠ” μ΄κ²ƒμ„ν–ˆλ‹€ : __postData = postData === '{}' ? '' : 포슀트 데이터__

그것이 당신을 λ„μšΈ 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€

μ €μ—κ²Œ 이것은 μš”μ²­ 헀더에 content-length : 0 κ°€ μžˆλŠ” POST μš”μ²­μ„ λ³΄λ‚΄λŠ” λ™μ•ˆ λ°œμƒν•©λ‹ˆλ‹€. 이 κ²°κ³Όκ°€ ν•©λ‹Ήν•œμ§€ λͺ¨λ₯΄κ² μ§€λ§Œ 적어도 μΆ”κ°€ν•œ ν—€λ”μ˜ 각 ν•­λͺ©μ„ μ œκ±°ν•˜μ—¬ 문제의 원인을 μ•Œμ•„λ‚Ό μˆ˜λŠ” μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

'GET'을 'POST'둜 λ³€κ²½ν•˜λ©΄ μˆ˜μ •ν•˜μ‹­μ‹œμ˜€. ν•˜μ§€λ§Œ 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. https://cnodejs.org/topic/57a6c35282e6ea4870ecd3f2 μ—μ„œ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ 'GET'을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ res.on('data', cb) μ‹€ν–‰ν•  수 μ—†λ‹€κ³  λ§ν–ˆμŠ΅λ‹ˆλ‹€.

@LvChengbin POST μš”μ²­μ—μ„œλ„ 같은 λ¬Έμ œμ— μ§λ©΄ν–ˆμŠ΅λ‹ˆλ‹€. Content-Length : 0 λ₯Ό μ‹ μ²΄μ˜ μ‹€μ œ 길이둜 λ°”κΎΈλŠ” 것이 νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λˆ„κ°€ λ‚  κ΅¬ν•΄μ€˜ :μ—”μ €:

bode v.8.9μ—μ„œλ„ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

{ 였λ₯˜: μ†ŒμΌ“ λŠκΉ€
createHangUpErrorμ—μ„œ (_http_client.js:331:15)
Socket.socketOnEndμ—μ„œ (_http_client.js:423:23)
emitNoneμ—μ„œ (events.js:111:20)
Socket.emitμ—μ„œ(events.js:208:7)
endReadableNTμ—μ„œ (_stream_readable.js:1064:12)
_combinedTickCallbackμ—μ„œ(λ‚΄λΆ€/ν”„λ‘œμ„ΈμŠ€/next_tick.js:138:11)
process._tickCallbackμ—μ„œ (internal/process/next_tick.js:180:9) μ½”λ“œ: 'ECONNR
ESET' }

λ‚΄ μ½”λ“œλŠ” μ•„λž˜μ— μžˆμŠ΅λ‹ˆλ‹€.

let request=require("μš”μ²­");
μš”κ΅¬({
URL: " http://192.168.31.29 :3019/tactics/createMediaHotTotal20",
λ©”μ†Œλ“œ: "GET",
json: 사싀,
헀더: {
"μ½˜ν…μΈ  μœ ν˜•": "μ‘μš© ν”„λ‘œκ·Έλž¨/json"
},
}, ν•¨μˆ˜(였λ₯˜, 응닡, λ³Έλ¬Έ) {
λ§Œμ•½ (였λ₯˜) {
console.log(였λ₯˜)
} 또 λ‹€λ₯Έ {
ν•΄κ²°(λ³Έλ¬Έ);
}
})

λ™μΌν•œ 문제, λ…Έλ“œ v9.5.0

const https = require("https");
const fs = require("fs");

process.env.NO_PROXY="yourcompany.com";

const options = {
  hostname: "en.wikipedia.org",
  port: 443,
  path: "/wiki/George_Washingtons",
  method: "POST",
  // ciphers: 'DES-CBC3-SHA'
};

const req = https.request(options, (res) => {
  let responseBody = "";
  console.log("Response started");
  console.log(`Server Status: ${res.statusCode} `);
  console.log(res.headers);
  res.setEncoding("UTF-8");

  res.once("data", (chunk) => {
    console.log(chunk);
  });

  res.on("data", (chunk) => {
    console.log(`--chunk-- ${chunk.length}`);
    responseBody += chunk;
  });

  res.on("end", () => {
    fs.writeFile("gw.html", responseBody, (err) => {
      if (err) throw err;
      console.log("Downloaded file");
    });
  });
});

req.on("error", (err) => {
  console.log("Request problem", err);
});
Request problem { Error: socket hang up
    at createHangUpError (_http_client.js:330:15)
    at TLSSocket.socketOnEnd (_http_client.js:423:23)
    at TLSSocket.emit (events.js:165:20)
    at endReadableNT (_stream_readable.js:1101:12)
    at process._tickCallback (internal/process/next_tick.js:152:19) code: 'ECONNRESET' }



md5-988987fef0feed585119ccc2fe5450ba



~/node-training> npm config ls -l
; cli configs
long = true
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.1.0 node/v9.5.0 darwin x64"

; userconfig /Users/katsanos/.npmrc
strict-ssl = false

; default values
access = null
allow-same-version = false
also = null
always-auth = false
audit = true
auth-type = "legacy"
bin-links = true
browser = null
ca = null
cache = "/Users/katsanos/.npm"
cache-lock-retries = 10
cache-lock-stale = 60000
cache-lock-wait = 10000
cache-max = null
cache-min = 10
cafile = undefined
cert = null
cidr = null
color = true
commit-hooks = true
depth = null
description = true
dev = false
dry-run = false
editor = "vi"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
force = false
git = "git"
git-tag-version = true
global = false
global-style = false
globalconfig = "/usr/local/etc/npmrc"
globalignorefile = "/usr/local/etc/npmignore"
group = 1493692218
ham-it-up = false
heading = "npm"
https-proxy = null
if-present = false
ignore-prepublish = false
ignore-scripts = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "/Users/katsanos/.npm-init.js"
init-version = "1.0.0"
json = false
key = null
legacy-bundling = false
link = false
local-address = undefined
loglevel = "notice"
logs-max = 10
; long = false (overridden)
maxsockets = 50
message = "%s"
; metrics-registry = null (overridden)
no-proxy = null
node-options = null
node-version = "9.5.0"
offline = false
onload-script = null
only = null
optional = true
otp = null
package-lock = true
package-lock-only = false
parseable = false
prefer-offline = false
prefer-online = false
prefix = "/usr/local"
production = false
progress = true
proxy = null
read-only = false
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
rollback = true
save = true
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-prefix = "^"
save-prod = false
scope = ""
script-shell = null
scripts-prepend-node-path = "warn-only"
searchexclude = null
searchlimit = 20
searchopts = ""
searchstaleness = 900
send-metrics = false
shell = "/usr/local/bin/fish"
shrinkwrap = true
sign-git-tag = false
sso-poll-frequency = 500
sso-type = "oauth"
; strict-ssl = true (overridden)
tag = "latest"
tag-version-prefix = "v"
timing = false
tmp = "/var/folders/kn/3cnpbcsx60n4fx_jv6sf4l80_mdkps/T"
umask = 18
unicode = true
unsafe-perm = true
usage = false
user = 356960985
; user-agent = "npm/{npm-version} node/{node-version} {platform} {arch}" (overridden)
userconfig = "/Users/katsanos/.npmrc"
version = false
versions = false
viewer = "man"

νŽΈμ§‘ : req.end() λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 곡μž₯

같은 버그가 μžˆμŠ΅λ‹ˆλ‹€. POSTλŠ” Content-Lengthκ°€ μš”μ²­μ— 좔가될 λ•Œ μž‘λ™ν•©λ‹ˆλ‹€. 이것이 μ—¬λŸ¬λΆ„μ—κ²Œ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.
'Content-Length': Buffer.byteLength(data) // μ½˜ν…μΈ  κΈΈμ΄λŠ” POST에 ν•„μš”ν•©λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” Connection: keep-alive 헀더λ₯Ό μ„€μ •ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜μ˜ ν•˜λ£¨λ₯Ό μ§€μΌœμ£Όμ„Έμš”!

쑰금 νŒŒλ΄…λ‹ˆλ‹€.
nodejs μ„œλ²„μ— POSTλ₯Ό 보낼 λ•Œ μš”μ²­μ— 일주일에 ν•œ 번 ν›„λ©΄ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
λ””νΌλ‘œ μ΄λ™ν•œ ν›„ μš”μ²­ ν˜•μ‹μ΄ 잘λͺ»λœ 경우 nodejsκ°€ 연결을 μ€‘λ‹¨ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

POST μš”μ²­μ΄ http.request둜 전달될 λ•Œ ν›„λ©΄ 버그가 λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” 본문이 λ§ˆμ§€λ§‰ 기호 없이 μ „μ†‘λ˜μ—ˆμœΌλ©° setContentLength() 의 Content-Lengthλ₯Ό 잘λͺ» κ³„μ‚°ν–ˆκΈ° λ•Œλ¬ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

'https' ν”„λ‘œν† μ½œ λŒ€μ‹  'http'λ₯Ό μ‚¬μš©ν•˜λ©΄ λ¬Έμ œλ„ ν•΄κ²°λ©λ‹ˆλ‹€.

이것은 맀우 μ‹€λ§μŠ€λŸ½μŠ΅λ‹ˆλ‹€. μ„œλ²„λ₯Ό μ œμ–΄ν•  수 μ—†μ§€λ§Œ Nodejsμ—μ„œ POSTλ₯Ό μˆ˜ν–‰ν•  μˆ˜λŠ” μ—†μ§€λ§Œ(μš”μ²­ λ˜λŠ” 수퍼 μ—μ΄μ „νŠΈ μ‚¬μš©) curl λ˜λŠ” Postman은 μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 더 미친 것은 μš”μ²­ λ¬Έμ—μ„œ 디버거λ₯Ό μ‚¬μš©ν•˜μ—¬ μΌμ‹œ μ€‘μ§€ν•˜κ³  κ³„μ†ν•˜λ©΄ 호좜이 μ„±κ³΅ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” '호슀트' 헀더λ₯Ό μ œκ±°ν•˜μ—¬ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ nodejs( 10.16.3 )둜 μ—…κ·Έλ ˆμ΄λ“œν•œ ν›„ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œλŠ” keepAlive: true 와 ν•¨κ»˜ nodejs http μ—μ΄μ „νŠΈλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 일이 λ°œμƒν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈλŠ” 무료 μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ μš”μ²­μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 같은 μ‹œκ°„μ— nodejs 버전 8에 λ‚˜νƒ€λ‚œ keepAliveTimeout μ„€μ •μœΌλ‘œ 인해 μ„œλ²„κ°€ μ†ŒμΌ“μ„ λ‹«μŠ΅λ‹ˆλ‹€.

ν•΄κ²°μ±…
μ§€κΈˆκΉŒμ§€ 두 가지 μ†”λ£¨μ…˜μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.
1) μ„œλ²„ μΈ‘μ—μ„œ 0 λ™μΌν•˜κ²Œ μ„€μ •ν•˜μ—¬ keepAliveTimeout λ₯Ό λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
2) keepAliveTimeout κ°’(기본적으둜 5초) 미만으둜 μ—¬μœ  μ†ŒμΌ“μ„ λ‹«μŠ΅λ‹ˆλ‹€. κΈ°λ³Έ http μ—μ΄μ „νŠΈλŠ” μ΄λŸ¬ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€( timeout 섀정은 μ§€μ›ν•˜μ§€ μ•ŠμŒ). κ·Έλž˜μ„œ μš°λ¦¬λŠ” agentkeepalive libλ₯Ό μ‚¬μš©

const HttpsAgent = require('agentkeepalive').HttpsAgent;

const agent = new HttpsAgent({
    freeSocketTimeout: 4000
});
let req = http.get(options, (res) => {
    ...........
    ...........
}).on('error', function(e) {
        console.error(e);
});

이 μ‹œλ„.

λΉ„μŠ·ν•œ λ¬Έμ œμ— 직면해 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ 6.11.xλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ λ…Έλ“œ 10을 μ‹œλ„ν–ˆμ§€λ§Œ 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” μš”μ²­ λͺ¨λ“ˆμ„ μ—…κ·Έλ ˆμ΄λ“œν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ 제곡된 λͺ¨λ“  μ œμ•ˆμ„ μΆ”κ°€ν–ˆμ§€λ§Œ 도움이 λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

문제 해결에 λŒ€ν•œ λ‹€λ₯Έ μ•„μ΄λ””μ–΄λ‚˜ 도움.

이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. API κ²Œμ΄νŠΈμ›¨μ΄μ— 이 문제λ₯Ό μΌμœΌν‚€λŠ” μ‹œκ°„ 초과 섀정이 μžˆμŠ΅λ‹ˆλ‹€. 쑰사해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. API κ²Œμ΄νŠΈμ›¨μ΄μ— 이 문제λ₯Ό μΌμœΌν‚€λŠ” μ‹œκ°„ 초과 섀정이 μžˆμŠ΅λ‹ˆλ‹€. 쑰사해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, μ–΄λ–€ μ’…λ₯˜μ˜ μ‹œκ°„ 초과 섀정이 이 문제λ₯Ό μΌμœΌν‚€λŠ”μ§€ μ•Œλ €μ£Όμ‹€ 수 μžˆμŠ΅λ‹ˆκΉŒ?

chai-http둜 경둜λ₯Ό ν…ŒμŠ€νŠΈν•  λ•Œλ„ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν„°λ¬΄λ‹ˆμ—†λŠ” 것은 처음 μ„Έ 가지가 ν•©κ²©μ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€!! λ‚˜λŠ” ν•˜λ£¨ 쒅일 그것을 μ§λ©΄ν•˜λ €κ³  λ…Έλ ₯ν•œλ‹€

μ—¬κΈ° λ‚΄ μ½”λ“œ :
```
log("μž‘μ—… ν…ŒμŠ€νŠΈ")
it("/login 경둜 ν…ŒμŠ€νŠΈ", done => {
차이
.μš”μ²­(μ„œλ²„)
.post("/둜그인")
.보내닀({ })
.end(ν•¨μˆ˜(였λ₯˜, 해상도) {
κΈ°λŒ€(err).to.be.null;
κΈ°λŒ€(res.status).to.not.equal(404);
κΈ°λŒ€(res.body.message).to.not.be.equal("찾을 수 μ—†μŒ");
μ™„λ£Œ();
});
});

log(였λ₯˜λ‘œ ν…ŒμŠ€νŠΈ μ‹€νŒ¨: μ†ŒμΌ“ λŠκΉ€)
it('/getResetCodePassword 경둜 ν…ŒμŠ€νŠΈ', (μ™„λ£Œ)=> {
차이
.μš”μ²­(μ„œλ²„)
.patch("/getResetCodePassword")
.보내닀({ })
.end( (였λ₯˜, 해상도) => {
console.log(였λ₯˜);
μ™„λ£Œ();
})
})

```

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰