TypeError:第一个参数必须是字符串或缓冲区

问题描述:

我最初使用的是节点v4.4.5,并且运行nodemon似乎工作正常。一旦我安装了更新的版本,一切都破裂了。我不太清楚为什么我得到这个错误,因为我只是试图让一个简单的节点运行。TypeError:第一个参数必须是字符串或缓冲区

继承人的守则。

var http = require('http'); 
var fs = require('fs'); 
var server = http.createServer(function (request, response){ 
console.log('client request URL: ', request.url); 
if(request.url === '/') { 
    fs.readFile('index.html', 'utf8', function (errors, contents){ 
     response.writeHead(200, {'Content-Type': 'text/html'}); 
     response.write(contents); 
     response.end(); 
    }); 
} 
else { 
    response.writeHead(404); 
    response.end('File not found!!!'); 
} 
}); 
server.listen(8000); 
console.log("Running in localhost at port 8000"); 
+1

您能否定义在哪条线上出现错误?这个问题的一个原因可能是'response.write'这一行,因为'content'是未定义的。也许'fs.readFile'回调已收到一个错误(错误),你没有检查这些错误。 –

+0

同意@MatteoRagni,导致错误的行号需要发布。另外,这可能是一个读取文件失败的问题。 – shaochuancs

+0

它没有指定。它会在终端中运行,但是一旦我转到网络上的本地主机,它会得到该错误。 – Gkata

我在Node版本:V8.2.1上运行了你的代码。 页面呈现没有任何错误。 安装Node.js的最新稳定版本:V6.11.2

+0

由于读取文件和写入响应是非常基本的操作,因此不太可能成为Node.js环境问题。 – shaochuancs

+0

它会在终端中运行,但只要在本地主机上打开它,就会发生错误。 – Gkata

+0

将您在根级目录 如index.html的: - ' 服务器 | -app.js | -index.html ' –

不知道错误的路线是非常困难的。你使用的库是非常基本的,你所使用的功能在所引用的版本中不应该不同(在接口方面)。

我建议你检查读取操作。 fs.readFile的回调具有尚未检查的errors字段。如果发生错误,contents可能保持未定义状态,因此错误由response.write方法引发,该方法需要缓冲区或字符串作为参数。

你可以试试:

response.write(String(contents)); 

和你的网页应该显示一个简单的 “不确定” 的字符串。如果是这种情况,那么下一步就是了解为什么“index.html”无法打开。

您可以通过使用在线调试器的节点运行您的代码行:

node inspect script.js 

您应该插入您希望通过线检查线停止debugger;。检查文档here

+0

谢谢你的文档。你是对的,它必须处理那个特定的行,因为它没有定义。这是错误给我的。 – Gkata

+0

客户端请求URL:/ _http_outgoing.js:457 throw new TypeError('第一个参数必须是字符串或缓冲区'); – Gkata