You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免getServerSideProps解析后访问'res'?NextJS报错求助

问题原因

你触发警告的核心原因是:在getServerSideProps函数执行完成(返回结果)之后,仍然在异步回调里操作res对象。

看你代码里的逻辑:当找到fileId时,你给GridFS的下载流绑定了data和end事件回调,然后直接执行了return { props: {} }。这时候getServerSideProps已经完成执行(被标记为resolve),但后续流的data、end事件是异步触发的,此时再调用res.write()、res.end()就属于“解析后访问res”,触发了NextJS的警告。

修复方案

把流的处理逻辑包装成Promise,确保所有对res的操作都在getServerSideProps执行完成前完成。可以直接用pipe方法简化流的传输,同时通过Promise等待流传输结束:

修改[hash].tsx中getServerSideProps里的fileId分支代码:

if (fileId) {
  const bucket = new GridFSBucket(database)
  const id = new ObjectId(fileId)
  const files: GridFSFile[] = await bucket.find({ _id: id }).toArray()
  const file = files[0]
  const { contentType, length } = file || {}

  res.writeHead(200, { 
    'Content-Type': contentType,
    'Content-Length': length.toString() // 可选,加上更规范
  })

  // 用Promise包裹流的处理,等待传输完成
  await new Promise<void>((resolve, reject) => {
    bucket.openDownloadStream(id)
      .pipe(res)
      .on('finish', () => {
        resolve()
      })
      .on('error', (err) => {
        reject(err)
      })
  })

  // 因为已经直接向客户端发送了文件响应,这里返回空props即可,页面不会被渲染
  return { props: {} }
}
额外说明
  • 当你直接通过res发送文件响应后,NextJS不会再渲染页面组件(也就是你的HashPage),所以返回空props是安全的。
  • 使用pipe方法比手动监听data事件更高效,还能自动处理背压问题,避免内存溢出。

内容的提问来源于stack exchange,提问作者user3142695

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:17:52