为什么我的 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);
});
});
我正在使用 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);
});
});