Helpex - Trao đổi & giúp đỡ Đăng nhập
98

Tôi chỉ đơn giản là đang cố gắng tạo một máy chủ nút xuất trạng thái HTTP của một URL nhất định.

Khi tôi cố gắng xóa phản hồi bằng res.write, tôi gặp lỗi: ném TypeError mới ('đối số đầu tiên phải là một chuỗi hoặc Bộ đệm');

Nhưng nếu tôi thay thế chúng bằng console.log, mọi thứ đều ổn (nhưng tôi cần ghi chúng vào trình duyệt chứ không phải giao diện điều khiển).

Mã là

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

Tôi tin rằng tôi nên thêm một cuộc gọi lại ở đâu đó nhưng khá bối rối và bất kỳ trợ giúp nào đều được đánh giá cao.

98 hữu ích 0 bình luận 241k xem chia sẻ
33

Yêu cầu có một phương thức gọi lại, không đồng bộ của nó! Vì vậy, tôi đang giả định rằng, vào thời điểm lệnh gọi lại được thực thi, res.end()có thể sẽ được gọi. Hãy thử đóng yêu cầu trong cuộc gọi lại.

33 hữu ích 3 bình luận chia sẻ
52

response.statusCodelà một số, ví dụ response.statusCode === 200, không phải '200'. Như thông báo lỗi cho biết, writemong đợi một stringhoặc Bufferđối tượng, vì vậy bạn phải chuyển đổi nó.

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

Mặc dù vậy, bạn cũng đúng về nhận xét gọi lại của mình. res.end();nên ở bên trong cuộc gọi lại, ngay bên dưới writecuộc gọi của bạn .

52 hữu ích 1 bình luận chia sẻ
48

Tôi nhận được thông báo lỗi này và nó đề cập đến options.body

Tôi đã có cái này ban đầu

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

Tôi đã thay đổi nó thành cái này:

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

và nó dường như hoạt động ngay bây giờ mà không có thông báo lỗi ... có vẻ như lỗi.

Tôi nghĩ đây là cách chính thức hơn để làm điều đó:

 request.post({
        url: apiServerBaseUrl + '/v1/verify',
        json: true,
        body: {
            email: req.user.email
        }
    });
48 hữu ích 2 bình luận chia sẻ
14

Rõ ràng là bạn đang cố gửi một thứ gì đó không phải là chuỗi hoặc bộ đệm. :) Nó hoạt động với console, vì console chấp nhận bất cứ thứ gì. Ví dụ đơn giản:

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

Một cách để chuyển đổi bất kỳ thứ gì thành chuỗi là thực hiện điều đó:

res.write( "" + obj );

bất cứ khi nào bạn đang cố gắng gửi một cái gì đó. Cách khác là gọi .toString()phương thức:

res.write( obj.toString( ) );

Lưu ý rằng nó vẫn có thể không phải là những gì bạn đang tìm kiếm. Bạn phải luôn chuyển chuỗi / bộ đệm đến .writemà không cần những thủ thuật như vậy.

Một lưu ý phụ: Tôi giả sử rằng đó requestlà một hoạt động không đồng bộ. Nếu đúng như vậy, thì res.end();sẽ được gọi trước bất kỳ lần viết nào, tức là bất kỳ lần viết nào cũng sẽ thất bại (vì kết nối sẽ bị đóng tại điểm đó). Di chuyển dòng đó vào trình xử lý:

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( );
});
14 hữu ích 1 bình luận chia sẻ
1

nếu bạn muốn ghi một đối tượng JSON vào phản hồi thì hãy thay đổi kiểu nội dung tiêu đề thành 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 hữu ích 0 bình luận chia sẻ
1

Và có một khả năng khác (không phải trong trường hợp này) khi làm việc với ajax (XMLhttpRequest), trong khi gửi thông tin trở lại máy khách, bạn nên sử dụng res.send (responsivext) thay vì res.end (responsivext)

1 hữu ích 0 bình luận chia sẻ
1

Mặc dù câu hỏi được giải quyết, chia sẻ kiến ​​thức để làm rõ nghĩa chính xác của lỗi.

Lỗi cho biết rằng tham số cần thiết cho hàm ngắt liên quan không ở định dạng bắt buộc, tức là chuỗi hoặc Bộ đệm

Giải pháp là thay đổi tham số thành chuỗi

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

hoặc đệm

breakingFunction(BSON.serialize(offendingParameter), ... other params...);
1 hữu ích 0 bình luận chia sẻ
0

Đối số đầu tiên phải là một trong chuỗi kiểu hoặc Bộ đệm. Đối tượng loại đã nhận

 at write_

Tôi đã gặp phải lỗi như trên khi chuyển dữ liệu nội dung vào mô-đun yêu cầu.

Tôi đã truyền một tham số khác là JSON: true và nó đang hoạt động.

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});})
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ node.js http callback , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading