nodejs-첫 번째 인수는 문자열 또는 버퍼 여야 함-http.request와 함께 response.write를 사용할 때


93

주어진 URL의 HTTP 상태를 출력하는 노드 서버를 만들려고합니다.

res.write로 응답을 플러시하려고하면 오류가 발생합니다. throw new TypeError ( 'first argument must be a string or Buffer');

하지만 console.log로 바꾸면 모든 것이 정상입니다 (하지만 콘솔이 아닌 브라우저에 써야합니다).

코드는

var server = http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/plain"});

    request({
        uri: 'http://www.google.com',
        method: 'GET',
        maxRedirects:3
    }, function(error, response, body) {
        if (!error) {
            res.write(response.statusCode);
        } else {
            //response.end(error);
            res.write(error);
        }
    });     

    res.end();
});
server.listen(9999);

어딘가에 콜백을 추가해야한다고 생각하지만 매우 혼란스럽고 도움을 주시면 감사하겠습니다.

답변:


32

요청은 비동기 메서드 인 콜백을받습니다! 그래서 나는 콜백이 실행될 때까지 호출 res.end()될 것이라고 가정하고 있습니다. 콜백 내에서 요청을 닫으십시오.


1
그렇게하고 .toString도 추가했습니다. 고맙습니다.
umutm

내가 잊은 것 같다. 그냥 했어요. 고마워.
umutm

1
@umutm 더 잘 작성되고 정교한 답변이 있습니다. 아마도 그들 중 하나를 받아 들여야합니다. 이 질문에 오는 모든 사람에게 공개됩니다.
Gaurav Agarwal

52

response.statusCode은 (는) 숫자가 response.statusCode === 200아닙니다 '200'. 오류 메시지가 말했듯이, write기대 string또는 Buffer개체를, 그래서 당신은 그것을 변환해야합니다.

res.write(response.statusCode.toString());

하지만 콜백 댓글에 대해서도 정확합니다. 호출 res.end();바로 아래의 콜백 내부에 있어야 write합니다.


네, 그게 트릭을했습니다. nodejs 초보자로서 그것을 몰랐고 너무 감사합니다.
umutm

48

이 오류 메시지가 표시되고 옵션이 언급됩니다.

원래 가지고 있었어

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: {
        email: req.user.email
    }
});

나는 이것을 다음과 같이 변경했다.

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: JSON.stringify({
        email: req.user.email
    })
});

그리고 그것은 오류 메시지없이 지금 작동하는 것 같습니다 ...하지만 버그처럼 보입니다.

나는 이것이 더 공식적인 방법이라고 생각합니다.

 request.post({
        url: apiServerBaseUrl + '/v1/verify',
        json: true,
        body: {
            email: req.user.email
        }
    });

4
문제는 다르며 본문은 기본적으로 문자열 또는 버퍼로 예상됩니다. 옵션에 json : true를 추가하여 (json 직렬화 가능하도록) 변경할 수도 있습니다. 예 : request.post ({url : apiServerBaseUrl + '/ v1 / verify', body : {email : req.user.email}, json : true})
Nuno Tomas

2
당신은 피하기 위해 이것을 사용할 수있는 캐릭터 라인 화 javascript request.post({ url: apiServerBaseUrl + '/v1/verify', json: { email: req.user.email } }
bsorrentino

13

글쎄, 분명히 당신은 문자열이나 버퍼가 아닌 무언가를 보내려고합니다. :) 콘솔은 무엇이든 받아들이 기 때문에 콘솔과 함께 작동합니다. 간단한 예 :

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails

무엇이든 문자열로 변환하는 한 가지 방법은 다음과 같습니다.

res.write( "" + obj );

무언가를 보내려고 할 때마다. 다른 방법은 .toString()메소드 를 호출 하는 것입니다.

res.write( obj.toString( ) );

여전히 찾고있는 것이 아닐 수도 있습니다. .write이러한 트릭없이 항상 문자열 / 버퍼를 전달해야합니다 .

참고 request로 비동기 작업 이라고 가정합니다 . 이 경우 res.end();쓰기 전에 호출됩니다. 즉, 모든 쓰기가 실패합니다 (연결이 해당 지점에서 종료되기 때문에). 해당 행을 핸들러로 이동하십시오.

request({
    uri: 'http://www.google.com',
    method: 'GET',
    maxRedirects:3
}, function(error, response, body) {
    if (!error) {
        res.write(response.statusCode);
    } else {
        //response.end(error);
        res.write(error);
    }
    res.end( );
});

답변과 자세한 정보에 감사드립니다. 그리고 예, res.end를 핸들러로 옮겼습니다. 이전처럼 @loganfsmyth를 수락했습니다. 다시 Thx.
umutm

1

응답에 JSON 객체를 쓰려면 헤더 콘텐츠 유형을 application / json으로 변경하십시오.

response.writeHead(200, {"Content-Type": "application/json"});
var d = new Date(parseURL.query.iso);
var postData = {
    "hour" : d.getHours(),
    "minute" : d.getMinutes(),
    "second" : d.getSeconds()
}
response.write(postData)
response.end();

1

그리고 ajax (XMLhttpRequest)로 작업 할 때 또 다른 가능성이 있습니다 (이 경우가 아님). 클라이언트 측으로 정보를 다시 보내는 동안 res.end (responsetext) 대신 res.send (responsetext) 를 사용해야합니다.


1

문제가 해결되었지만 오류의 올바른 의미를 명확히하기 위해 지식을 공유합니다.

오류는 관련된 중단 함수에 필요한 매개 변수가 필요한 형식 (예 : 문자열 또는 버퍼)이 아니라는 것을 나타냅니다.

해결책은 매개 변수를 문자열로 변경하는 것입니다.

breakingFunction(JSON.stringify(offendingParameter), ... other params...);

또는 버퍼

breakingFunction(BSON.serialize(offendingParameter), ... other params...);

0

첫 번째 인수는 문자열 또는 버퍼 유형 중 하나 여야합니다. 수신 된 유형 객체

 at write_

요청 모듈에 본문 데이터를 전달하는 동안 위의 오류가 발생했습니다.

JSON 인 또 다른 매개 변수를 전달했습니다. true 및 작동합니다.

var option={
url:"https://myfirstwebsite/v1/appdata",
json:true,
body:{name:'xyz',age:30},
headers://my credential
}
rp(option)
.then((res)=>{
res.send({response:res});})
.catch((error)=>{
res.send({response:error});})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.