节点js中未处理的承诺拒绝错误

时间:2020-10-24 02:50:52

标签: javascript node.js express sequelize.js

执行组合查询时出现错误

我正在使用,续集和mysql

这是我的代码:

const makeAuthenticate = async (req, res) => {
  const newOtp = Math.floor(100000 + Math.random() * 900000);
  try {
    const {phone} = req.body;
    
    const [user, created] = await db.User.findOrCreate({
      where: { phone: phone },
    })
      .then(e => {
         db.User.update({ otp: newOtp }, {
          where: {
            phone: phone
          }})
            .then(f => res.status(200).json({
              otp: newOtp
            }))
            .catch(err => res.status(500).json({error: err})) // Error comes from here !
      })
      .catch(err => res.status(500).json({error: err})) 
  } catch (error) {
    return res.status(500).json({error: error.message})
  }
}

这是代码的作用:

基本上,我在单个查询中同时进行注册和登录,换句话说,首先使用findOrCreate-我找到了该用户,或者我将创建一个新用户,然后我需要发送一次密码(临时6位数)数字”)到他们在流程中使用的电话号码。

因此,我正在将otp更新到我的用户表,然后我需要加总以将SMS发送给用户的调用(我尚未完成此操作),因此目前处于findOrCreate的阶段并进行另一个更新调用特定用户。

到此,出现如下错误:

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

1 个答案:

答案 0 :(得分:1)

尝试这样的事情

startStepFunctionMock

无需嵌套承诺,beforeEach(() => { startStepFunctionMock.resetHistory(); }); 可以使用const makeAuthenticate = async (req, res) => { const newOtp = Math.floor(100000 + Math.random() * 900000) const {phone} = req.body try { const [user, created] = await db.User.findOrCreate({ where: { phone: phone } }) const updatedRes = await db.User.update({ otp: newOtp }, { where: { phone: phone }}) res.status(200).json({ otp: newOtp }) } catch(e) { res.status(500).json({error: err}) } } ,因为.then()使用承诺。

您的代码的主要问题是您在await内使用了Sequelize,他们俩都试图发送失败状态。因此,很可能您的问题出在其他地方,但这是一个副作用,当您运行我的代码时,应该看到真正的问题(如果存在)。