在node.js中抛出新的TypeError('第一个参数必须是字符串或缓冲区')

时间:2016-04-22 10:07:35

标签: node.js typeerror

我是节点js的新手,并在一周前开始学习。

创建小型服务器时出现以下错误:

_http_outgoing.js:543     抛出新的TypeError('第一个参数必须是字符串或缓冲区');     ^

TypeError:第一个参数必须是字符串或缓冲区     在ServerResponse.OutgoingMessage.end(_http_outgoing.js:543:11)     at call_backfunction(/Users/Aman/Documents/learn/node/app3/server.js:36:8)     at iterator(/Users/Aman/Documents/learn/node/app3/server.js:57:6)     在/Users/Aman/Documents/learn/node/app3/server.js:68:6     在FSReqWrap.oncomplete(fs.js:82:15)

function loadAlbums(req, res){
    var call_backfunction = function(err, album_list){
        if(err){
            res.writeHead(503, {"Content-Type": "text/plain"});
            res.end("There are no albums in folder. " + err + "\n");
        }
        else{
            res.writeHead(200, {"Content-Type": "text/json"});
            res.end(album_list);
        }
    }

    albumLoader(req, res, call_backfunction);
}


function albumLoader(req, res, callback){
    var path = req.core_url.pathname.substr(1, 6);
    fs.readdir(path, function(err, files){
        if(err){
            callback(err);
            return;
        }   
        else{
            var dirs = [];
            (function iterator(i) {
                console.log(dirs);
                if(i>=files.length){
                    callback(null, dirs);
                    return;
                }
                fs.stat(path + "/" + files[i], function(err, stat){
                    if(err){
                        callback(err);
                        return;
                    }
                    else if(stat.isDirectory){
                        dirs.push(files[i]);
                    }
                    iterator(i+1);
                });
            })(0);          
        }
    });
}

当我将回调参数更改为

时,它工作正常
callback(null, dirs.toString());

我真的不明白这里的逻辑,为什么它需要字符串或缓冲区。

1 个答案:

答案 0 :(得分:3)

res.end(data)(指定了data参数)等同于res.write()和res.end()。 res.write()只接受字符串或Buffer作为它的参数。阅读更多here

运行此代码时,album_list是一个数组。

res.end(album_list);

将dirs数组转换后,将album_list参数转换为Buffer或字符串后,您将不会收到此错误。

它必须是字符串或缓冲区,因为响应正文的默认编码是utf8字符编码。

相关问题