我是节点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());
我真的不明白这里的逻辑,为什么它需要字符串或缓冲区。
答案 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字符编码。