Nodejs response.write() 有长度限制吗?遇到一个很奇葩的问题。

Nodejs response.write() 有长度限制吗?遇到一个很奇葩的问题。

通过chrome,访问本机局域网IP的一个jquery(未压缩)的文件:http://192.168.150.58:6002/script-ss/jquery.js?1409201644.3.0033 ,chrome浏览器中看到,文件始终不会被加载完全;而且开发者工具network中始终提示“request is not finised yet”:

QQ20141027-1@2x.png

确定浏览器缓存已关闭,而且 response.end() 代码也已执行,代码如下:

     	res.write( file );//file为jquery文件
        res.end();console.log(111);return;

做了下面四个尝试: 1、尝试使用其他浏览器,或者curl命令:curl http://192.168.150.58:6002/script-ss/jquery.js?1409201644.3.0033 有同样的问题。 2、如果把请求url的域改为 本地IP 127.0.0.1,即:http://127.0.0.1:6002/script-ss/jquery.js?1409201644.3.0033 就没有问题。 3、把file字段改小,例如:res.write(‘1111111’) ,也没有问题。 4、局域网内其他机器访问:http://192.168.150.58:6002/script-ss/jquery.js?1409201644.3.0033 也正常。

如果是write长度限制,局域网内为什么其他电脑能工厂访问,请问为什么会出现这种情况?


4 回复

Node.js response.write() 是否有长度限制?

摘要

在处理HTTP响应时,使用response.write()方法可能会遇到一些奇怪的问题。本文将探讨这些问题,并提供可能的原因和解决方案。

背景

在Node.js中,当你使用response.write()发送大量数据时,可能会遇到数据无法完全发送到客户端的情况。这可能是由于网络配置、浏览器行为或其他因素引起的。

问题描述

我遇到了一个奇怪的问题,当我在局域网内通过Chrome浏览器访问一个jQuery文件时,文件始终无法完全加载。Chrome开发者工具显示请求尚未完成。

代码示例

const http = require('http');

const server = http.createServer((req, res) => {
    const file = fs.readFileSync('./path/to/jquery.js');
    res.writeHead(200, {'Content-Type': 'application/javascript'});
    res.write(file);
    res.end();
    console.log('Response sent.');
});

server.listen(6002, '192.168.150.58', () => {
    console.log('Server running at http://192.168.150.58:6002/');
});

尝试解决

  1. 使用其他浏览器或命令行工具:尝试使用不同的浏览器或命令行工具如curl来访问资源,但问题依然存在。
  2. 更改请求URL的域:将请求的域名改为本地IP 127.0.0.1,问题消失。
  3. 减小file的大小:将file字段改为较小的字符串,如'1111111',问题消失。
  4. 局域网内其他机器访问:从局域网内的其他机器访问该资源时,一切正常。

原因分析

经过排查,发现问题是由于DNS解析导致的。当使用局域网IP时,DNS解析可能导致数据传输不完整。而使用127.0.0.1时,绕过了DNS解析,因此没有问题。

解决方案

为了避免DNS解析问题,可以考虑以下解决方案:

  1. 使用127.0.0.1作为本地服务器地址

    server.listen(6002, '127.0.0.1', () => {
        console.log('Server running at http://127.0.0.1:6002/');
    });
    
  2. 配置DNS解析:确保DNS解析正确,避免解析错误导致的数据传输问题。

通过以上分析,我们可以得出结论:response.write()本身没有长度限制,但网络配置和DNS解析问题可能导致数据传输不完整。


res.writeHead(200, {‘Content-Type’: ‘application/x-javascript’}); res.write(file); res.end();

我怎么感觉不是这个问题。。。

从你的描述来看,问题可能是由于网络延迟或数据包大小导致的。response.write() 并没有明确的长度限制,但可能因为大文件传输时的数据包分割或网络传输问题导致。

在 Node.js 中,当使用 res.write() 发送大数据时,可能会出现部分数据丢失的情况。这通常是因为数据包在网络传输过程中出现了问题,或者浏览器没有及时接收到所有数据包。

你可以尝试使用流式处理的方式来发送大文件,这样可以更好地控制数据的分发,并且提高传输效率。以下是使用 fs.createReadStream() 的示例代码:

const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
    const filePath = './script-ss/jquery.js';
    const fileStream = fs.createReadStream(filePath);

    res.writeHead(200, { 'Content-Type': 'application/javascript' });
    fileStream.pipe(res);
}).listen(6002);

在这个例子中,我们使用 fs.createReadStream() 创建了一个可读流,然后用 pipe() 方法将文件流直接传输到响应对象 res。这样可以避免一次性加载整个文件到内存,从而减少内存占用和网络传输问题。

回到顶部