Javascript 在promise中包装异步函数
我正在创建一个简单的web应用程序,它使用Express和Sequelize处理请求并与SQL db通信。当前我在对对象调用异步函数时遇到了一个问题,对象的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()正在工作 我
这部分未定义。我将函数包装在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()
};