为什么我的 Express 服务器响应仅在 SSR 期间被截断?

Why is my Express server response truncating during SSR only?

我正在使用 Next.js、Redux 和 Express。我的页面有这个代码:

static async getInitialProps({store, isServer, pathname, query}) {
  const res = await fetch('http://localhost:3001/tutorials');
  const tutorials = await res.json();
  store.dispatch(tutorialsReceived({tutorials}));
}

我收到 React 调试错误,说我的服务器响应与我的客户端不同。它期待一个非常长的 JSON 响应 (252KB),并且服务器渲染被提前中断。我尝试了两种发送文件的方法,但不确定为什么会缩短。

// Try 1
server.get('/tutorials', (req, res) => {
  fs.createReadStream('./common/content.json').pipe(res);
});

// Try 2
server.get('/tutorials', (req, res) => {
  fs.readFile('./common/content.json', 'utf8', function(err, tutorials) {
    res.send(tutorials);
  });
});

{a:1,b:2,c:3} 一样将文件修改得更小,我的完整性检查没有出现错误。

看起来 express 在响应中设置了错误的 Content-Length header,因此您的 JSON 被截断了。你可以明确地设置它,这应该有效。

server.get('/tutorials', (req, res) => {
    fs.readFile('./common/content.json', 'utf8', function (err, tutorials){
        res.writeHead(200, {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(tutorials, 'utf8')
        })
        res.send(tutorials);
    });
});