Nodejs:将它们发送到后无法设置 headers

Nodejs: Cannot set headers after they are sent to the

我用 NodeJS 写这段代码:

const setOutput = (res, req, data) => {
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify(data));
}

app.post('/getDb', async (req, res, next) => {
    if (!req.body.hasOwnProperty('key')) {
        setOutput(res, req, {
            error: true,
            message: 'You must send key'
        })
    }
    
    const db = openDb(req.body.key);
    
    if (!db) {
        setOutput(res, req, {
            error: true,
            message: 'Not found key'
        })
    }

    setOutput(res, req, {
        error: false,
        message: 'DB create successful',
        data: {
            min: 0.1
        }
    });
})

此代码工作正常,但出现此错误:

(node:253965) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

调用后如何停止任何操作 setOutput

注意:我不想使用 switch 或很多 if else

基本上,您正试图在一个请求中多次调用 setOutput 箭头函数。这就是为什么在发送后终止执行可能会有所帮助:

if (!req.body.hasOwnProperty('key')) {
        setOutput(res, req, {
            error: true,
            message: 'You must send key'
        })
      return;
    }

const db = openDb(req.body.key);

if (!db) {
    setOutput(res, req, {
        error: true,
        message: 'Not found key'
    })
  return;
}

在您的请求中,您多次调用 setOutput,这意味着请求将被发送到客户端,但 app.post 中的回调函数继续执行,因为您没有 returned app.post 的回调中的任何内容你都调用了另一个函数,在这种情况下是 setOuput 所以在 nodejs 世界中错误只是意味着你现在无法准备 [=17] 向客户端发送响应=] 简单的解决方案是 return 像这样发送每个请求后 `

app.post('/getDb', async (req, res, next) => {
    if (!req.body.hasOwnProperty('key')) {
       return setOutput(res, req, {
            error: true,
            message: 'You must send key'
        })
    }
    
    const db = openDb(req.body.key);
    
    if (!db) {
        return setOutput(res, req, {
            error: true,
            message: 'Not found key'
        })
    }

    setOutput(res, req, {
        error: false,
        message: 'DB create successful',
        data: {
            min: 0.1
        }
    });
})

`