μλ νμΈμ, κ·Έλ° λ¬Έμ κ° μ΄μ μ μμ±λ κ²μΌλ‘ μκ³ μμ§λ§ μ½κ° λ€λ₯Έ μ€λͺ μ΄ μμ΅λλ€.
κ°λ¨ν μμ²μ μννλ €κ³ νμ΅λλ€: μμ λ°μ΄ν° 보λ΄κΈ°. κ·Έλ¬λ μμ² λͺ¨λμ μ¬μ©ν λ νμ "μμΌ λκΈ°"κ° λ°μν©λλ€.
κ°λ¨ν ν μ€νΈ μΌμ΄μ€ λ° κ²°κ³Ό μλ
'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.
μμ² λͺ¨λμ λ²κ·ΈμΈ κ² κ°μ΅λλ€.
λμΌν λ¬Έμ κ° μμ§λ§ 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).
μ§μ νμ λ²κ·Έ λλ¬Έμ κ·Έλ° μΌμ΄ λ°μνμ§ μλλ€κ³ μκ°ν©λλ€. μ°λ¦¬μ κ²½μ° λ€μκ³Ό κ°μ΄ λνλ©λλ€.
μΌλ°μ μΈ κ²½μ° λ°±μλ μλ²μμ μ΄ μ€λ₯λ₯Ό λ°μμμΌμΌ νκΈ° λλ¬Έμ μ΄ μ€λ₯κ° λ°μνλ κ²μ΄ νΌλμ€λ½μ΅λλ€.
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? 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()
λ₯Ό μ¬μ©νκ³ λ¬Έμ λ μ¬λΌμ‘λ€.
λλ κ°μ λ¬Έμ κ° μμλ€.
@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 μμ΄μ νΈλ₯Ό μ¬μ©νμ΅λλ€. λ€μκ³Ό κ°μ μΌμ΄ λ°μν κ² κ°μ΅λλ€.
ν΄κ²°μ±
μ§κΈκΉμ§ λ κ°μ§ μ루μ
μ μ°Ύμμ΅λλ€.
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(μ€λ₯);
μλ£();
})
})
```
κ°μ₯ μ μ©ν λκΈ
λκ° λ ꡬν΄μ€ :μμ €: