【问题标题】:React Native/Node API: Can't set headers after they are sentReact Native/Node API:发送后无法设置标头
【发布时间】:2018-01-20 15:18:12
【问题描述】:

我的 react 本机应用程序与我的 Node API 交互时遇到问题。 当我尝试通过节点发布数据以更新数据库中的某些值(然后转到存储过程)时,我得到一个 500 - 在节点中发送后无法设置标题

我能找到的一切都表明这可能是由于发送了两次响应。我不认为这是这种情况。我已经在邮递员中进行了测试,一切正常,它返回的状态为 200,返回的数据正确。

我正在尝试像这样将数据发布到 API:

  const myHeaders = new Headers();
  myHeaders.append('Content-Type', 'application/json');


  fetch(`http://localhost:3000/user/preferences`, {
      method: 'POST',
      headers: myHeaders,
      mode: 'cors',
      cache: 'default',
      body: JSON.stringify({
        id: '1',
        minage: this.state.minageValue,
        maxage: this.state.maxageValue
      })
  })
      .then(response => response.json())
      .then(body => console.log(body))
      .catch(err => console.log(err));

我在 API 端接收它并将数据传递给存储过程:

function updatePreferences(req, res, next) {
    console.log(req);
    var userid = req.body[0].id;
    var minage = req.body[0].minage;
    var maxage = req.body[0].maxage;

    db.func('___spsavepreferences', [userid, minage, maxage])
        .then(function(data){
            res.status(200)
                .json({
                    status: 'success',
                    preferences: data
                });
        });
}

有什么想法吗?

编辑:

不知道这是否告诉我什么,但我已将错误消息记录到控制台:

Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:504:11)
at ServerResponse.setHeader (_http_outgoing.js:511:3)
at ServerResponse.header (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:730:10)
POST /user/preferences 500 410.809 ms - 189
    at ServerResponse.send (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:170:12)
    at done (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:967:10)
    at Object.exports.renderFile (/Users/user/Projects/Project_node/node_modules/jade/lib/index.js:374:12)
    at View.exports.__express [as engine] (/Users/user/Projects/Project_node/node_modules/jade/lib/index.js:417:11)
    at View.render (/Users/user/Projects/Project_node/node_modules/express/lib/view.js:128:8)
    at tryRender (/Users/user/Projects/Project_node/node_modules/express/lib/application.js:640:10)
    at Function.render (/Users/user/Projects/Project_node/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:971:7)
    at /Users/user/Projects/Project_node/app.js:51:7
    at Layer.handle_error (/Users/user/Projects/Project_node/node_modules/express/lib/router/layer.js:71:5)
    at trim_prefix (/Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:315:13)
    at /Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:335:12)

编辑 2:知道了。我需要接收 req.body.id、req.body.minage 等值...而不是 req.body[0].id。 出现这样的错误很奇怪,但这解决了错误。

【问题讨论】:

    标签: node.js reactjs react-native cors fetch-api


    【解决方案1】:

    如果您在邮递员中看到不同的行为,那是因为邮递员只是直接执行POST,而浏览器在尝试POST 之前执行了CORS preflight OPTIONS request

    所以听起来导致“发送后无法设置标头”的请求是OPTIONS 请求,而不是POST 请求。 p>

    您可以通过使用邮递员发送OPTIONS 请求来确认这一点,并确保还提供Origin 请求标头作为请求的一部分。使用curl,您可以这样做:

    curl -X OPTIONS -i -H 'Origin: http://x.y' http://localhost:3000/user/preferences
    

    这很可能会产生与您在浏览器请求中看到的相同的 500 错误。

    至于如何修复它,我认为这里的任何其他人都无法在没有看到更多服务器端代码的情况下告诉你。但它似乎归结为,在您的代码中的某处,您有一个或多个具有处理OPTIONS 请求的逻辑的位置,而在该OPTIONS 处理代码中的某处,它试图在它们发送标头之后发送已经发送了。

    要追踪它的位置,您似乎想查看服务器端的服务器日志,并查找发生 500 故障时记录的任何消息。

    顺便说一句,在这种情况下,触发浏览器执行 COR 预检 OPTIONS 请求的开头是 myHeaders.append('Content-Type', 'application/json') 部分。

    【讨论】:

    • 您好杂耍,感谢您的回复。我可能完全错了,但这似乎不是问题。我通过 curl 发送选项请求并得到 200 的响应 - 这似乎表明一切都很好......我还有多个其他 API 端点(看起来几乎完全相同,只是存储过程名称和参数不同)那工作正常。我已经用错误消息更新了我的帖子。该应用程序的其余部分几乎是标准节点安装 - 我根本没有改变太多。
    • 好的,不确定答案实际上有多大帮助,但我确实看到你从你的更新到你设法找到原因并修复它的问题,所以我很高兴听到你的声音找到了解决方案:)
    猜你喜欢
    • 2018-12-18
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多