关于使用express报错:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

浏览器中首次能够访问

{
"code": 200,
"data": [
	{
	"url": "https://www.douyin.com"
	}
],
"message": "请求成功!"
}

image

第二次访问就无法访问了 😂,使用 postman也可以多次访问,难道是浏览器问题?而且其他请求也没有这样问题只有这个 /search请求有问题~

image

控制台报错信息如下

Error [ERR_HTTP_HEADERS_SENT]: Cannot remove headers after they are sent to the client
    at new NodeError (node:internal/errors:387:5)
    at ServerResponse.removeHeader (node:_http_outgoing:711:11)
    at ServerResponse.send (D:\desktop\Learn\project\sort-link\server\node_modules\express\lib\response.js:214:10)
    at D:\desktop\Learn\project\sort-link\server\src\controller\index.js:53:22
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
node:internal/errors:477
    ErrorCaptureStackTrace(err);

关键代码如下:

router.get('/search',  function (request, response) {
    console.log('search:',request.query.urlKey)
    if(request.query && request.query.urlKey){
        selectOne(request.query.urlKey).then(res=>{
            response.status(200).json(success(res))
            response.send()
        }).catch(e=>{
            console.error(e)
            response.status(500).json(error())
            response.send()
        })
    }else{
         response.status(500).json(error(500,'请指定连接key!'))
         response.send()
    }
    return;
})

在百度上搜索错误之后,进本上说是什么 return 问题 ,去 stackoverflow 搜索也没找到对应错误问题
几个有用链接如下

image

虽然这个方案和我的代码没什么关联,但是基本上可以说明是二次连接,也就是说什么多次访问 代码没有return,我的不是return问题,于是尝试删除response.send()

方案一 删除send

router.get('/search',  function (request, response) {
    console.log('search:',request.query.urlKey)
    if(request.query && request.query.urlKey){
        selectOne(request.query.urlKey).then(res=>{
            response.status(200).json(success(res))
			// 删除 response.send()
        }).catch(e=>{
            console.error(e)
            response.status(500).json(error())
			// 删除 response.send()
        })
    }else{
         response.status(500).json(error(500,'请指定连接key!'))
		 // 删除 response.send()
    }
	// 此处不需要return
})

方案二 不删除send,但是需要指定类型

router.get('/search',  function (request, response) {
    console.log('search:',request.query.urlKey)
    if(request.query && request.query.urlKey){
        selectOne(request.query.urlKey).then(res=>{
            response.status(200).type('application/json').send(success(res))
        }).catch(e=>{
            console.error(e)
            response.status(500).type('application/json').send(error())
        })
    }else{
         response.status(500).type('application/json').send(error(500,'请指定连接key!'))
    }
})

总结
通过逻辑,看 json() 底层应该是指定了 类型为 appliction/json ,并且可能调用了 send()
如果指定类型,无需调用 json() 这样就不冲突了

问题
这里还是没解决为什么只有这个请求报错,其他类似的 GET 请求没报错

更新下: 项目地址: 短链接服务

posted @ 2023-01-19 18:25  wuxin001  阅读(553)  评论(0编辑  收藏  举报