Development Tip

nodejs-http.request와 함께 response.write를 사용하는 경우 첫 번째 인수는 문자열 또는 버퍼 여야합니다.

yourdevel 2020. 10. 7. 21:22
반응형

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

Note that it still might not be what you are looking for. You should always pass strings/buffers to .write without such tricks.

As a side note: I assume that request is a asynchronous operation. If that's the case, then res.end(); will be called before any writing, i.e. any writing will fail anyway ( because the connection will be closed at that point ). Move that line into the handler:

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

if u want to write a JSON object to the response then change the header content type to 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();

And there is another possibility (not in this case) when working with ajax(XMLhttpRequest), while sending information back to the client end you should use res.send(responsetext) instead of res.end(responsetext)


Although the question is solved, sharing knowledge for clarification of the correct meaning of the error.

The error says that the parameter needed to the concerned breaking function is not in the required format i.e. string or Buffer

The solution is to change the parameter to string

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

or buffer

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

참고URL : https://stackoverflow.com/questions/14835582/nodejs-first-argument-must-be-a-string-or-buffer-when-using-response-write-w

반응형