使用 Axios 时获取 "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"

Getting "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client" while using Axios

我正在尝试使用不同的 Axios 调用从远程服务器获取一些数据。一个接一个的调用正在工作,但只要我直接一个接一个地调用它们,它就会抛出关于 headers 的错误消息。我已经做了一些研究,我想它必须这样做,因为第一个调用的 headers 妨碍了第二个调用。这可能是对问题的非常简单的描述,但我是 node js 的新手以及那些 axios 调用的工作方式。

这是我的 Api 调用之一的示例:

app.get('/api/ssh/feedback', function(req, res){
    conn.on('ready', function(){
        try {
            let allData = {}
            var command = 'docker ps --filter status=running --format "{{.Names}}"'
            conn.exec(command, function(err, stream){
                if (err) throw console.log(err)
                stream.on('data', function(data){
                    allData = data.toString('utf8').split('\n').filter(e=>e)
                    return res.json({status: true, info: allData})
                })
                stream.on('close', function(code){
                    console.log('Process closed with: ' + code)
                    conn.end()
                })
                stream.on('error', function(err){
                    console.log('Error: ' + err)
                    conn.end()
                })
            })
        } catch (err) {
            console.error('failed with: ' + err)
 
        }
    }).connect(connSet)
})

我正在使用 express js 作为中间件和 shh2 包来获取与远程服务器的连接。我在通话之前提到的方式有效但如果不是第一次通话就会崩溃。重新启动 express 服务器后,我可以再次使用 api。

这就是我在节点 js 前端中通过 axios 调用 api 的方式:

getNetworkStatus(e){
        e.preventDefault()
        axios.get('/api/ssh/network').then(res =>{
            if(res.data.status){
                this.setState({network_info: 'Running'})
                this.setState({network: res.data.info})
            } else {
                this.setState({network_info: 'No Network Running'})
                this.setState({network: 'No Network detected'})
            }
        }).catch(err => {
            alert(err)
        })
    }

如能提供解决此问题的任何帮助或建议,我将不胜感激。感谢所有花时间帮助我的人。

您提供的代码中存在两个问题:

  1. 您正在对 'data' 事件做出假设。通常,永远不要假设您在 'data' 事件中收到的块的大小。您可能会得到一个字节,也可能会得到 1000 个字节。当接收到块时,可以多次调用该事件,这很可能是导致错误的原因。附注:如果命令只输出文本,那么你最好使用 stream.setEncoding('utf8')(而不是手动调用 data.toString('utf8')),因为它会处理 multi-byte 可能被分割的字符大块。

  2. 您正在重复使用同一个连接对象。这是一个问题,因为每次到达 HTTP 端点时,您都​​将继续添加越来越多的事件处理程序。而是将 const conn = ... 移到端点处理程序中。这也可能导致您收到错误。