Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺待定的韩元';我不能决定或拒绝_Javascript_Node.js_Azure Functions - Fatal编程技术网

Javascript 承诺待定的韩元';我不能决定或拒绝

Javascript 承诺待定的韩元';我不能决定或拒绝,javascript,node.js,azure-functions,Javascript,Node.js,Azure Functions,我有一个更新密码功能,可以更新用户的密码并删除生成的一次性URL。当前,它向前端返回一个空响应,变量updatedResult表示Promise pending,因此这似乎是空响应的问题。当我执行代码时,这就是输出。我在两个地方添加了updateResultconsole.log()输出来引用它的输出: 代码也可以工作。我的密码更新了,我可以用新密码登录,但由于这个承诺问题,我没有得到回复 USER IS $2b$10$VBjWX9KPX2dVMVcdFASFSDFbG9XjONHqe0bJDj

我有一个更新密码功能,可以更新用户的密码并删除生成的一次性URL。当前,它向前端返回一个空响应,变量
updatedResult
表示Promise pending,因此这似乎是空响应的问题。当我执行代码时,这就是输出。我在两个地方添加了
updateResult
console.log()输出来引用它的输出: 代码也可以工作。我的密码更新了,我可以用新密码登录,但由于这个承诺问题,我没有得到回复

USER IS $2b$10$VBjWX9KPX2dVMVcdFASFSDFbG9XjONHqe0bJDjKUvY/S7/gSC4sPbhIekBTa
[4/15/2020 3:21:22 PM] JSON.stringify(payload)
[4/15/2020 3:21:22 PM] {"id":"5e92133edab88409dc4d1219","email":"bob@gmail.com","iat":1586963845,"exp":1586963945}
[4/15/2020 3:21:22 PM] updated Result From Here
[4/15/2020 3:21:22 PM] Promise { <pending> }
[4/15/2020 3:21:22 PM] Executed 'Functions.PATCH-PWReset-Update' (Succeeded, Id=2fd8968c-fcad-4db0-a5e4-3ab7f41700e6)
[4/15/2020 3:21:22 PM] Executed HTTP request: {
[4/15/2020 3:21:22 PM]   "requestId": "5ae5c23c-3861-4594-81f3-18de4a8631d1",
[4/15/2020 3:21:22 PM]   "method": "PATCH",
[4/15/2020 3:21:22 PM]   "uri": "/api/PATCH-PWReset-Update",
[4/15/2020 3:21:22 PM]   "identities": [
[4/15/2020 3:21:22 PM]     {
[4/15/2020 3:21:22 PM]       "type": "WebJobsAuthLevel",
[4/15/2020 3:21:22 PM]       "level": "Admin"
[4/15/2020 3:21:22 PM]     }
[4/15/2020 3:21:22 PM]   ],
[4/15/2020 3:21:22 PM]   "status": 200,
[4/15/2020 3:21:22 PM]   "duration": 722
[4/15/2020 3:21:22 PM] }
[4/15/2020 3:21:22 PM] updatedResult
[4/15/2020 3:21:22 PM] Promise { <pending> }
[4/15/2020 3:21:25 PM] Host lock lease acquired by instance ID '000000000000000000000000179CDB79'.
Url.findOneAndDelete({Url:generatedUrl})。然后(documents=>{
console.log(“updateResult”);
console.log(updatedResult);
你必须等待UpdateResult承诺,你可以

updateResult.then(值=>{
//…剩下的逻辑。。。
})
或者等待两个承诺完成

Promise.all([
findOneAndDelete({Url:generatedUrl}),
更新结果
]).然后(([文档,值])=>{
//…剩下的逻辑。。。
})

我从您的代码中得到的是:

  • 您正在查找用户
  • 然后并行更新密码和一次性URL
您将获得挂起的错误,因为您没有解析在查找用户中创建的承诺

const updatedResult = new Promise((resolve, reject) => {
   bcrypt.hash(req.body.password, 10, function(error, hash) {
     if (error) {
       reject(error);
     }
     newPasswordHash = hash;
     // res.sendStatus(401);

     try {
       const updated = User.updateOne({ password: newPasswordHash });
       resolve(updated);
     } catch (err) {
       reject(err);
     }
     reject();
   });
});
为了以一种干净的方式进行,我建议创建一个单独的函数,并从中调用db操作。类似如下:

module.exports = function(context, req) {
  // TODO: Fetch user from database using
  User.findById(req.body.id)
    .then((res) => {
      console.log('USER IS ' + res.password);
      var secret = res.password + '-' + res.passwordCreated.getTime();
      var payload = jwt.decode(req.body.token, secret);
      return Promise.all([updatePassword(req), deleteOneTimeUrl(req)]);
    })
    .then((result) => {
      context.json = {
        status: 200,

        body: {
          message: 'Password updated!',
        },

        headers: {
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
          'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
          'Access-Control-Max-Age': '86400',
          Vary: 'Accept-Encoding, Origin',
          'Content-Type': 'application/json',
        },
      };

      context.done();
    })
    .catch((err) => {
      context.res = {
        status: 500,

        headers: {
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
          'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
          'Access-Control-Max-Age': '86400',
          Vary: 'Accept-Encoding, Origin',
          'Content-Type': 'application/json',
        },
      };
      if (err.errorCode == 'DELETE_FAIL')
        context.res.body = {
          message: 'ONE TIME URL DELETE ERROR',
          error: err.error,
        };
      else
        context.res.body = {
          message: 'PW Update Failed!',
        };

      context.done();
    });
};

function deleteOneTimeUrl(req) {
  let generatedUrl = `http://localhost:4200/resetpassword/${req.body.id}/${req.body.token}`;
  return Url.findOneAndDelete({ url: generatedUrl })
    .then(res => { return Promise.resolve(res);})
    .catch((error) => {
      return Promise.reject({ errorCode: 'DELETE_FAIL', error: error });
    });
}

function updatePassword(req) {
  return new Promise((resolve, reject) => {
    bcrypt.hash(req.body.password, 10, function(error, hash) {
      if (error) {
        reject({ errorCode: 'UPDATE_FAIL', error: error });
      }
      newPasswordHash = hash;
      // res.sendStatus(401);
      try {
        const updated = User.updateOne({ password: newPasswordHash });
        resolve(updated);
      } catch (err) {
        reject({ errorCode: 'UPDATE_FAIL', error: error });
      }
      reject({ errorCode: 'UPDATE_FAIL' });
    });
  });
}

你能不能把它简化为一个。既然
updatedResult=newpromise
,为什么你看不到一个承诺呢?你从来没有在等待
updatedResult
承诺,那么你为什么还要看到其他东西呢?应该是
const updatedResult=wait newpromise(…
(记住标记为
async
函数)我让它工作等待和异步,但我试图不使用它。我正在使用azure函数,但我还无法将异步函数返回到angular。我尝试了不同的代码,所有这些都在我的nodejs后端工作,返回到angular没有问题,但我移植的azure函数版本没有问题,因此我必须将它们转换为angularo.然后承诺让它玩得很好。在我更改它之前看起来是这样的:除了上面提到的,我相信
User.updateOne
会返回一个承诺,所以你必须在它的末尾链接一个
,然后
。谢谢你的例子!但是我得到一个错误:
TypeError:PromiseResolve调用了非object
>这是完整的日志:你知道为什么吗?你需要从
deleteOneTimeUrl
函数返回一个承诺。我已经在代码中进行了更正。效果很好。谢谢你的帮助和解释!
module.exports = function(context, req) {
  // TODO: Fetch user from database using
  User.findById(req.body.id)
    .then((res) => {
      console.log('USER IS ' + res.password);
      var secret = res.password + '-' + res.passwordCreated.getTime();
      var payload = jwt.decode(req.body.token, secret);
      return Promise.all([updatePassword(req), deleteOneTimeUrl(req)]);
    })
    .then((result) => {
      context.json = {
        status: 200,

        body: {
          message: 'Password updated!',
        },

        headers: {
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
          'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
          'Access-Control-Max-Age': '86400',
          Vary: 'Accept-Encoding, Origin',
          'Content-Type': 'application/json',
        },
      };

      context.done();
    })
    .catch((err) => {
      context.res = {
        status: 500,

        headers: {
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': 'PATCH, OPTIONS',
          'Access-Control-Allow-Headers': 'Content-Type, Set-Cookie',
          'Access-Control-Max-Age': '86400',
          Vary: 'Accept-Encoding, Origin',
          'Content-Type': 'application/json',
        },
      };
      if (err.errorCode == 'DELETE_FAIL')
        context.res.body = {
          message: 'ONE TIME URL DELETE ERROR',
          error: err.error,
        };
      else
        context.res.body = {
          message: 'PW Update Failed!',
        };

      context.done();
    });
};

function deleteOneTimeUrl(req) {
  let generatedUrl = `http://localhost:4200/resetpassword/${req.body.id}/${req.body.token}`;
  return Url.findOneAndDelete({ url: generatedUrl })
    .then(res => { return Promise.resolve(res);})
    .catch((error) => {
      return Promise.reject({ errorCode: 'DELETE_FAIL', error: error });
    });
}

function updatePassword(req) {
  return new Promise((resolve, reject) => {
    bcrypt.hash(req.body.password, 10, function(error, hash) {
      if (error) {
        reject({ errorCode: 'UPDATE_FAIL', error: error });
      }
      newPasswordHash = hash;
      // res.sendStatus(401);
      try {
        const updated = User.updateOne({ password: newPasswordHash });
        resolve(updated);
      } catch (err) {
        reject({ errorCode: 'UPDATE_FAIL', error: error });
      }
      reject({ errorCode: 'UPDATE_FAIL' });
    });
  });
}