gpt4 book ai didi

javascript - 在 promise 中包装异步函数

转载 作者:行者123 更新时间:2023-12-04 09:34:29 25 4
gpt4 key购买 nike

我正在创建一个简单的 Web 应用程序,该应用程序使用 Express 和 Sequelize 处理请求并与 SQL 数据库通信。目前我在对象上调用异步函数时遇到问题,this对象的一部分是 undefined .我将函数包装在 express-async-handler 中处理 promise 返回,奇怪的是,如果我删除异步方法上的处理程序包装器,我就可以访问 this但正如预期的那样没有正确处理错误。我误解/做错了什么?下面是代码:
用户 Controller .js

var models  = require('../models');
const asyncHandler = require('express-async-handler')

var user = models.User

exports.registerUser = asyncHandler(async function(req, res) {
var username = req.body.username,
password = req.body.password;
u = user.build({
username: username, password: password
})

await u.registerUser()
res.send('hello world')
}
);
user.js 不工作
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 = asyncHandler(async function () {
await bcrypt.hash(this.password, 10, (err, hash) => { // not able to access 'this'
if(err) throw err;

// Set the hashed password and save the model
this.password = hash;
this.save()
});
})
};
user.js 删除 asyncHandler() 工作
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()
});
}
};

最佳答案

I am wrapping the functions in the express-async-handler to handle the promises returns


不,你不需要这样做。您的 promise 返回 User.prototype.registerUser方法处理得很好
await u.registerUser()
您只需要 asyncHandler Express 路由处理程序的包装器,它不知道如何处理 async function 返回的 promise s。

If I remove the handler wrapper on the async method I am able to access this, but as expected does not handle errors correctly.

asyncHandler也无助于处理该错误。问题是你做
if(err) throw err;
在异步回调中,这只是使您的应用程序崩溃的未处理异常。相反,您需要 promisify bcrypt.hash这样你就会得到一个会被拒绝的 promise 。或者只是 use the promise version :
User.prototype.registerUser = async function () {
const hash = await bcrypt.hash(this.password, 10)
this.password = hash;
await this.save()
};

关于javascript - 在 promise 中包装异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62661022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com