Javascript 在promise中包装异步函数

Javascript 在promise中包装异步函数,javascript,node.js,express,Javascript,Node.js,Express,我正在创建一个简单的web应用程序,它使用Express和Sequelize处理请求并与SQL db通信。当前我在对对象调用异步函数时遇到了一个问题,对象的这部分未定义。我将函数包装在express async handler中,以处理承诺返回,奇怪的是,如果我在async方法上删除处理程序包装,我就能够访问此,但正如预期的那样,无法正确处理错误。我有什么误解/做错了?代码如下: userController.js user.js不工作 user.js删除asyncHandler()正在工作 我

我正在创建一个简单的web应用程序,它使用Express和Sequelize处理请求并与SQL db通信。当前我在对对象调用异步函数时遇到了一个问题,对象的
这部分
未定义。我将函数包装在
express async handler
中,以处理承诺返回,奇怪的是,如果我在async方法上删除处理程序包装,我就能够访问
,但正如预期的那样,无法正确处理错误。我有什么误解/做错了?代码如下:

userController.js

user.js不工作

user.js删除asyncHandler()正在工作

我将函数包装在
expressasync处理程序中
以处理返回

不,你不需要那样做。您的
User.prototype.registerUser
方法返回的承诺在这行代码中处理得很好

await u.registerUser()
在快速路由处理程序上只需要
asynchHandler
包装器,它不知道如何处理
async函数
s返回的承诺

如果我删除异步方法上的处理程序包装,我可以访问
this
,但正如预期的那样,它不能正确处理错误

asynchHandler
也无助于处理该错误。问题是你会

if(err) throw err;
在异步回调中,这只是一个未处理的异常,会使应用程序崩溃。相反,您需要
bcrypt.hash
,以便得到一个将被拒绝的承诺。或者只是:


听起来好像
asynchHandler
在调用处理程序时没有传递
this
。除了不使用它,或者(更好)分叉项目,修复它(这应该非常容易),并向他们发送拉请求之外,你没有什么可以做的了…:-)如何调用
register
(等)?顺便说一句,控制器中的
u
是一个意外的全局变量。感谢您的工作,这很有意义!要添加一件事,我还必须将
wait
添加到
this.save()
中,否则调用时会出现无法处理的错误。@walshbm15是的,有道理,我忘记了
save()
也会返回一个承诺
const bcrypt = require('bcrypt');
const asyncHandler = require('express-async-handler')

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    id: {
      type: DataTypes.UUID,
      defaultValue: sequelize.literal('uuid_generate_v4()'),
      primaryKey: true
    },
    name: DataTypes.STRING,
    username: DataTypes.STRING,
    password: DataTypes.STRING,
  }, {
    paranoid: true,
  });

  // Associations
  User.associate = function(models) {
    // associations can be defined here
    User.hasMany(models.Cat, {
      foreignKey: 'userId',
      as: 'cats',
      onDelete: 'CASCADE',
    })
  };

  // Instance methods
  User.prototype.registerUser = async function () {
    await bcrypt.hash(this.password, 10, (err, hash) => {
      if(err) throw err;

      // Set the hashed password and save the model
      this.password = hash;
      this.save()
    });
  }
};
await u.registerUser()
if(err) throw err;
User.prototype.registerUser = async function () {
  const hash = await bcrypt.hash(this.password, 10)
  this.password = hash;
  await this.save()
};