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


6 回复

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

在这个示例中:

  1. 我们创建了一个 HTTP 服务器。
  2. 当接收到请求时,首先使用 res.writeHead() 方法设置响应状态码(200)和响应头("Content-Type": "text/html")。
  3. 使用 res.write() 方法发送响应体内容。
  4. 最后使用 res.end() 方法结束响应。

确保在调用 res.write() 之前已经设置了响应头,这样可以避免出现 TypeError: first argument must be a string or Buffer 错误。

回到顶部