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

주어진 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);

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



답변

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


답변

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

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

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


답변

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

원래 가지고 있었어

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
        }
    });


답변

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

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( );
});


답변

응답에 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();


답변

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


답변

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

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

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

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

또는 버퍼

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