Nodejs first argument must be a string or Buffer异常
Nodejs first argument must be a string or Buffer异常
http.js:853 throw new TypeError(‘first argument must be a string or Buffer’); ^ TypeError: first argument must be a string or Buffer at ServerResponse.OutgoingMessage.write (http.js:853:11) at IncomingMessage.<anonymous> (D:\nodejs\workspace\express1.js:15:9) at IncomingMessage.EventEmitter.emit (events.js:92:17) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13) 这个错误都是因为response没有输入相应头信息引起的,增加如下代码可以解决,但不必一样,只要输出响应头信就行; res.writeHead(200,{“Content-Type”:“text/html”});
Node.js first argument must be a string or Buffer
异常
当你在使用 Node.js 编写 HTTP 服务器时,如果尝试向 ServerResponse
对象写入数据而未提供有效的第一个参数(即必须是一个字符串或 Buffer),就会抛出 TypeError: first argument must be a string or Buffer
错误。这通常发生在你试图直接调用 res.write()
方法之前没有设置响应头。
示例代码
假设你有以下的 Express 应用程序代码片段:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// 直接调用 res.write() 而没有设置响应头
res.write("Hello, World!"); // 这将引发错误
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解决方法
为了修复这个错误,你需要确保在调用 res.write()
或 res.end()
之前设置响应头。正确的做法是在发送任何响应体之前先调用 res.writeHead()
方法。
以下是修改后的代码示例:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// 设置响应头
res.writeHead(200, {"Content-Type": "text/plain"});
// 现在可以安全地写入响应体
res.write("Hello, World!");
res.end(); // 最好使用 res.end() 来结束响应
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
res.writeHead(statusCode, [statusMessage], [headers])
: 设置响应的状态码和头部信息。res.write(chunk[, encoding][, callback])
: 向响应体写入数据。必须在调用res.writeHead()
之后调用。res.end([data][, encoding][, callback])
: 结束响应过程。如果你已经调用了res.write()
,最好使用res.end()
来确保所有数据都被正确发送。
通过遵循这些步骤,你可以避免在 Node.js 中遇到 first argument must be a string or Buffer
的错误,并确保你的 HTTP 响应能够正确处理。
at ServerResponse.OutgoingMessage.write (http.js:853:11) 这一行已经说明了 你调用response.write的时候给的第一个参数不是string或者buffer
谢谢你的回答,我发这个主题出来是告诉以后有人碰到这情况,怎么处理,只要加下面一行就OK了 res.writeHead(200,{“Content-Type”:“text/html”});
也不是这样的,这个是输出响应报头,假如: res.writeHead(‘Content-Type’, ‘text/html;charset=utf-8’); res.write({name: ‘xx’}); res.end(); 还是会报错的,如果想输出对象的话,用express的res.send({name: ‘xx’})内部自动输出mime类型为application/json
官方文档说了:<br/> response.write(chunk, [encoding]) 这个函数chunk can be a string or a buffer。例如如果是chunk是boolean的话,就肯定会报这样子的错。所以要分析什么原因导致chunk不是string 或者 buffer.
你遇到的 TypeError: first argument must be a string or Buffer
异常通常是因为在使用 Node.js 的 HTTP 模块时,试图将一个非字符串或非缓冲区的数据作为参数传递给 write()
方法。为了正确处理这种情况,你需要确保在写入响应体之前设置了正确的响应头。
以下是一个简单的示例,演示了如何正确设置响应头并发送响应内容:
const http = require('http');
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, {"Content-Type": "text/html"});
// 发送响应内容
res.write("<h1>Hello, World!</h1>");
res.end(); // 确保结束响应
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个示例中:
- 我们创建了一个 HTTP 服务器。
- 当接收到请求时,首先使用
res.writeHead()
方法设置响应状态码(200)和响应头("Content-Type": "text/html"
)。 - 使用
res.write()
方法发送响应体内容。 - 最后使用
res.end()
方法结束响应。
确保在调用 res.write()
之前已经设置了响应头,这样可以避免出现 TypeError: first argument must be a string or Buffer
错误。