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

获取用户帖子时出现Can't set headers after they are sent错误

错误原因

你触发的Can't set headers after they are sent to the client是典型的后端接口重复发送HTTP响应导致的错误。
问题出在后端getUserById控制器的分支逻辑:当查询不到对应用户、!userPosts判断成立时,代码执行了res.status(404).json()返回404响应,但没有终止函数执行,后续代码会继续运行,再次执行res.status(200).json()尝试返回200响应。此时HTTP响应头已经在第一次返回时发送给客户端,第二次尝试设置响应头就会抛出该错误。
另外原控制器逻辑还有两个隐藏问题:

  • 数据库查询抛出异常时,catch块只打印错误,没有返回响应,会导致请求挂起
  • 所有分支的响应前都没有加return阻断逻辑,很容易出现重复返回的问题
修复方案

1. 修正后端控制器逻辑

所有响应分支前加return,确保返回响应后立刻终止函数执行,同时补全数据库查询异常的响应处理:

export const getUserById = async (req, res) => {
    const userId = req.params.id;
    let userPosts;
    try {
        userPosts = await User.findById(userId).populate("posts");
    } catch (error) {
        console.log(error)
        return res.status(500).json({ message: "Failed to fetch user posts" })
    }
    if (!userPosts) {
        return res.status(404).json({ message: "No Post Found" })
    }
    return res.status(200).json({ user: userPosts })
}

2. 补全前端请求的错误兜底

原前端请求逻辑中,如果接口报错走了catch分支,res会是undefined,后续读取res.data会触发前端JS报错,调整请求逻辑增加兜底:

const UserPosts = () => {
    const [user, setUser] = useState()

    useEffect(() => {
        const id = localStorage.getItem("userId");
        const sendRequest = async () => {
            try {
                const res = await axios.get(`/post/user/${id}`)
                const data = res.data;
                console.log(data)
                return data;
            } catch (error) {
                console.log(error)
                return { user: null }
            }
        }

        sendRequest()
            .then((data) => {
                setUser(data.user)
                console.log(data)
            })
    }, [])


    return (
        <div>
            {user &&
                user.posts.map((post, index) => (
                    <Post
                        id={post._id}
                        isUser={true}
                        key={index}
                        username={user.username}
                        caption={post.caption}
                        selectedFile={post.selectedFile}
                        createAt={post.createAt}
                    />
                )).reverse()}
        </div>
    )
}

export default UserPosts;
报错截图参考
  • 服务端报错:
    服务端报错截图
  • 客户端报错:
    客户端报错截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:18:38