์๋ ํ์ธ์, ์ผ๋ถ ์ฝ๋๋ฅผ ์คํํ๊ณ ์์๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
_http_outgoing.js:441
throw new TypeError('first argument must be a string or Buffer');
^
TypeError: first argument must be a string or Buffer
at ClientRequest.OutgoingMessage.write (_http_outgoing.js:441:11)
at Request.write (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:1392:25)
at end (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:550:16)
at Immediate._onImmediate (/Users/tomasnovella/workspace/kitt/kitt-chrome-sync/node_modules/request/request.js:578:7)
at processImmediate [as _immediateCallback] (timers.js:383:17)
์ฌ๋ฏธ์๋ ์ ์ ์์ฒญ ๋ชจ๋์ ํ์ฌ ๋ฒ์ ์ ์ด์ ๋ฒ์ (### v2.60.0 (2015/07/21), changelog์ ๋ฐ๋ฆ)์ผ๋ก ๊ต์ฒดํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
request.post({
url: '<someURL>',
qs: {
'client': 'Google+Chrome',
'client_id': config.clientId
},
headers: {
'Content-Type': 'application/octet-stream',
'Authorization': 'Bearer '+ accessToken
},
encoding: null, // if you expect binary data
responseType: 'buffer',
body: body
}, (error, response, body) => {..blah...});
body
๋ ์ด๋ค ๋ฐ์ดํฐ ์ ํ์
๋๊น? ๋ํ responseType
์์ฑ์ด ์์ต๋๋ค.
body = new Uint8Array(request.toArrayBuffer())
๋๋ resopnseType์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง (์๋ํ๊ธฐ ๋๋ฌธ์) ์ค์ํ์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ ์ฃ ?
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณธ๋ฌธ์ String
๋๋ Buffer
์ด์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์๋ก์ด ์ ํ์ ๋ํด์๋ ํ์คํ์ง ์์ต๋๋ค.
๊ธ์์, ์ง๊ธ๊น์ง๋ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด ์๋ก์ด ๋ด์ฅ ์ ํ์ ๋ณด๋ด๋ ๋ฐ _๊ทธ ์์ฒด๋ก_ ๋ฌธ์ ๊ฐ ์์์์ ์๋ฏธํฉ๋๋ค.
๋ถํ์ํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ์ผ๋ถ if ์กฐ๊ฑด๋ง ์ธ์์ ์ผ๋ก ์ถ๊ฐ๋์์ต๋๋ค.
์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ํซํฝ์ค๋ฅผ ์ฐพ์์ง๋ง ๋ค์ ๋ถํ์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
https://www.npmjs.com/package/uint8
์ด ๋ชจ๋์ด ์๋ ์ฝ์ด์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. NodeJS ๋ฒ์ ์ ์ ๊ทธ๋ ์ด๋ํ ๊ฒฝ์ฐ ํ๋ซํผ ์ ๊ทธ๋ ์ด๋์ ๊ด๋ จ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์์ฒญ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์กฐ๊ฑด์ด๋ผ๋ฉด? ์ง๊ธ๊น์ง ๋ฌด์์ด ์๋ํ๊ณ ์์์ต๋๊น?
์๋์, ์ด ์ค๋ฅ๋ ๋
ธ๋์์ ์คํํ ๋ ๋ฐ์ํฉ๋๋ค. npm(์ด์ )์ ์
๊ทธ๋ ์ด๋ํ ๋๊น์ง ๋ฐ์ํ์ง ์์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ node_modules/request๋ฅผ ์ด์ ๊ฒ์ผ๋ก ๋ฎ์ด์ผ์ ๋ ๋ค์ ์๋ํ๊ธฐ ์์ํ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋
ธ๋ ์ฝ์ด ์์ฒด์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ๋งค์ฐ ์ด์ํฉ๋๋ค.
์ด์ํ ์์ด๋์ ๋๋ค. ๊ณผ๊ฑฐ PR์์ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ์ฉ์์๋ฅผ ์ฐพ์์ง๋ง ๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ค๋ฉด _exact_ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ์คํํ ์ ์๋ ์์ ์์ฒด ํฌํจ ์ฝ๋ ์์ ์ ๋๋ค.
์ด ์ฝ๋๋ ์ด๋ป์ต๋๊น?
var request = require('request');
request.post({
url: 'https://clients4.google.com/chrome-sync/command',
qs: {
'client': 'Google+Chrome',
'client_id': '12345'
},
headers: {
'Content-Type': 'application/octet-stream',
'Authorization': 'Bearer 123'
},
encoding: null, // if you expect binary data
responseType: 'buffer',
body: new Uint8Array(3)
}, function(e,r,b){console.log(e,r,b)});
์ฌ๊ธฐ์ ๊ณ ์ #1905
์ํผ, ๊ฐ์ฌํฉ๋๋ค! :)
์๋ค ์,
๋ฒ์ 2.70.0์ด ์ค์น๋์ด ์์ง๋ง ์ฌ์ ํ ๋์ผํ ์ค๋ฅ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค.
TypeError: first argument must be a string or Buffer
at ServerResponse.OutgoingMessage.end (_http_outgoing.js:524:11)
at /Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/index.js:87:17
at Request._callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/routes/proxy.js:81:7)
at Request.self.callback (/Users/urbanmarovt/Documents/Faks/BCH/Diploma/PoC/gateway/node_modules/request/request.js:200:22)
์ด๊ฒ์ ํ์ฌ ์ฌ์ฉํ๋ ๋ด ์ฝ๋์ ๋๋ค.
var options = {
url: url,
path: req.path,
qs: req.query,
method: req.method,
headers: headers,
responseType: 'buffer',
timeout: TIMEOUT
};
options.json = true;
options.body = {
"firstName": "Test1",
"lastName": "Test2",
"email": "[email protected]",
"mobilePhone": "+38631288288"
};
request(options, function (error, response, body) {
callback(error, response, body, options);
});
๋ด ์ฝ๋์ ์ง๋ฌธ์ด ์ถฉ๋ถํ ๋ช ํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ์ค๋ฅ๋ ๋ฐ์ํ์ต๋๋ค.
@novelizator ๋ค์ ์ด์ด
@banomaster @Ohar body
๋ String
๋๋ Buffer
์ฌ์ผ ํฉ๋๋ค.
@simov ์ค ๊ฐ์ฌํฉ๋๋ค.
๋๋ ์ฌ์ฉํ๋ค
res.write(data);
res.end();
JSON์ ๋ฐํํ์ง๋ง ์๊ฒฉ ์๋ฒ์์ ์ด ๋ฌธ์ (#1904)๊ฐ ๋ฐ์ํฉ๋๋ค.
res.json()
์์ ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ JSON์ ์ด์ค์ผ์ดํํ๊ณ ๋ฌธ์์ดํํฉ๋๋ค. ํ์ง๋ง ์๋ต์ผ๋ก JSON์ ๊ฐ์ ธ์์ผ ํ๊ณ res.json
๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ด์ค์ผ์ดํ๋ ๋ฌธ์์ด์ ๋ณด๋
๋๋ค.
๋์์ฃผ์๊ฒ ์ด์?
function foo (req, res) {
request.post(
'https://example.com/api',
{form: data},
function (error, response, body) {
res.json(body);
}
);
}
"{\"response\":{\"data\":{}},\"status\":0}"
{
"response": {
"data": {}
},
"status": 0
}
json
์ต์
์ true
๋ก ์ค์ ํ๊ณ ๋ฌธ์์ ์ต์
์น์
๋ ์ดํด๋ณด์ธ์.
๋ง์ง๋ง ์ง๋ฌธ์ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ค๋ฅธ ์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ์ ์ง๋ฌธ์ ๊ฒ์ํ์ธ์.
์์ฐ, ๋ธ๋ผ๋ณด ์์ฒญํ, ๋ฉ์ด์ ๋ฒ์ ์ ๊ทธ๋ ์ด๋ ์์ด ์ธํฐํ์ด์ค ๊นจ๋ ๋ฐฉ๋ฒ :/
@mboudreau ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๋ฌด์์ด ํจ๊ณผ๊ฐ ์๋์ง ์ ํํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ณธ์ง์ ์ผ๋ก ์ ๋ 2.64.x๋ถํฐ request๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ํญ์
์์ฒญ์ ์ํด ์๋์ผ๋ก ์ง๋ ฌํ๋ ๋ณธ๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ต์ ๋ฒ์ ์ดํ๋ก๋ ๋ ์ด์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก
์ ๋ฒ์ ์ด ๋์์ ๋ ๋์์ ์ฌ๋ฌ ๋น๋๋ฅผ ์ค๋จํ์ต๋๋ค.
๋งค์ฐ ๋น๋ฐ์ค๋ฌ์ด ์ค๋ฅ ๋ฉ์์ง์ ํจ๊ป.
๋ด๊ฐ ์ง์ฆ๋๋ ์ด์ ๋ ์๋ฏธ ๋ก ์ ๋ฒ์ ๊ด๋ฆฌ ํ์ค ๋๋ฌธ์
๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง(Breaking Change)๊ฐ ๋์
๋ ๋ ๋ฉ์ด์ ๋ฒ์ ์
์ฆ๊ฐํฉ๋๋ค. ์ด ์ค๋ ๋์์ ๋ณผ ์ ์๋ฏ์ด ์ต์ ๊ธฐ๋ฅ ๋ฒ์ ์
๋ง์ ์ฌ๋๋ค์ ์ํด ํ์ฐํ๊ณ ๊ฐ์ธ์ ์ผ๋ก ๋์๊ฒ ๋ง์ ์ข์ ๊ณผ ๋ญ๋น๋ฅผ ์ด๋ํ์ต๋๋ค.
์ด ์ค๋ฅ๋ฅผ ํ์
ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์์ฒด ํฐ์ผ์๋ฐ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ๋จ์ง ๊ฒฝ๊ณ
๋ณ๊ฒฝํ๊ณ ์๋ฏธ ์ฒด๊ณ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค.
2016๋ 4์ 29์ผ ๊ธ์์ผ ์คํ 5์ 28๋ถ์ simo [email protected]์ด ์์ฑํ์ต๋๋ค.
@mboudreau https://github.com/mboudreau ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๋ฌด์์ด ๋น์ ์๊ฒ ํจ๊ณผ๊ฐ ์๋์ง ์ ํํ ์ค๋ช ํ์ธ์?โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/request/request/issues/1904#issuecomment -215646824
๊ทํ์ ๊ฒฝ์ฐ์ ์์๋๋ ํ๋์ด ๋ฌด์์ธ์ง ์์ง ํ์คํ์ง ์์ต๋๊น? body
์ต์
์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ณ ๋ฌธ์์ดํ๋ JSON ๋๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋ณธ๋ฌธ์ ๋ณด๋ผ ๊ฒ์ผ๋ก ์์ํ์ญ๋๊น?
์ด๋ ์ชฝ์ด๋ ๋ฒ๊ทธ๋ฅผ ์ฌํํ๊ธฐ ์ํ ์ฝ๋ ์์ ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๋ฌธ์์์:
body
- PATCH, POST ๋ฐ PUT ์์ฒญ์ ๋ํ ์ํฐํฐ ๋ณธ๋ฌธ์ ๋๋ค. ๋ฒํผ, ๋ฌธ์์ด ๋๋ ReadStream์ด์ด์ผ ํฉ๋๋ค. json์ด true์ด๋ฉด body๋ JSON ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ฒด์ฌ์ผ ํฉ๋๋ค.
๋ค์์ ํ ์คํธํ ์ ์์ต๋๋ค.
request({
method: 'POST',
url: 'http://requestb.in/tr4jaxtr',
body: {a: 1},
json: true,
callback: (err, res, body) => {
if (err) {
console.log(err)
}
console.log(body)
}
})
์ฌ๊ธฐ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ ์ ์ ๋์ ์ด ์ค๋ฅ๋ฅผ ๋ง์ง์๊ฑฐ๋ฆฌ๋ค๊ฐ ์๊ฒ ๋ ์ฌ์ค์
๋๋ค. ๊ฒ์ ์์ฒญ ๋งค๊ฐ๋ณ์ ์ ํ์ด {form: {key: 1}}
๊ฒฝ์ฐ ๊ฒ์ ๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํํ์ง๋ง, {body: {key: 1}}
๊ฒฝ์ฐ new TypeError('first argument must be a string or Buffer');
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ฐฉ๊ธ {body: JSON.stringify({key: 1})}
ํ๊ณ ์์ฒญ์ด ์ฑ๊ณตํ์ต๋๋ค. ๋๋ ์์ง ์์ค๋ฅผ ์กฐ์ฌํ์ง ์์์ง๋ง ์ด๊ฒ์ด ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
๋ํ options ๊ฐ์ฒด์ json: true
๋ฅผ ์ค์ ํ๋ฉด ์์ฒญ ๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ์ body: {}
๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ๋์ json: {}
์ฌ์ฉํ์ญ์์ค.
๋๋๋ก ์ต๊ณ ์ ๋ต๋ณ์ ์ค๋ ๋์ ๋งจ ์๋์ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค @itsyogesh @cozzbie
@novellizator ์ฌ๋ฌ๋ถ, ์ด๊ฒ์ ๋ซํ ๋ฌธ์ ์์ง๋ง ๋ฐ์ด๋๋ฆฌ ์ด๋ฏธ์ง์ ๋ํด ๊ทธ๋ ๊ฒ ํ๊ณ ์๊ณ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์์ํดํฉ๋๋ค.
app.post(self._options.baseUrl + '/image.post', function (req, res) {
delete req.headers.host;
var headers= req.headers;
headers['Content-Type'] = 'application/octet-stream';
request.post('http://localhost:9080/image.post',
{
headers: headers,
encoding: null, // if you expect binary data
responseType: 'buffer',
body: req.body
},
function (error, response, body) {
if (!error && response.statusCode == 200) {
res.send(body);
res.end();
} else {
res.send({ error: new Error('image error') });
res.end();
}
})
})
์ด๋ด, ๋ฐฉ๊ธ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๋ค. json body
์ ๋ณด๋ด๊ณ ์์์ง๋ง body: JSON.stringify(body)
๋ฌธ์์ด๋ก ๋ณํํด์ผ ํ์ต๋๋ค.
Uint8Array
๋ฅผ ๋ด ๋ชธ์ผ๋ก ์ค๋ฅ ์์ด ์ฌ์ฉํ๊ณ ์์๋๋ฐ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 0์ธ ์์ฒญ์ ๋ณด๋์ ๋ ๊ฐ์๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ง๋ ์ด๋ค ์์ผ๋ก๋ ์ฝ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฒ๊ทธ๊ฐ ์์ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ์
body: {}
๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ๋์json: {}
์ฌ์ฉํ์ญ์์ค.