Node.js 异步等待性能命中
对于下面的express控制器方法,嵌套了一些异步等待,它会有任何性能影响吗 为了简单起见,所有逻辑当前都位于控制器方法中。但我很清楚我可以重构这些 我在一些promise解决方案上使用了async。在高层。我不确定这是否会显著降低性能,或者这是否是一种有争议的做法Node.js 异步等待性能命中,node.js,express,async-await,Node.js,Express,Async Await,对于下面的express控制器方法,嵌套了一些异步等待,它会有任何性能影响吗 为了简单起见,所有逻辑当前都位于控制器方法中。但我很清楚我可以重构这些 我在一些promise解决方案上使用了async。在高层。我不确定这是否会显著降低性能,或者这是否是一种有争议的做法 async registerUser(req, res, next) { const trx = await transaction.start(this.User.knex()); let userData =
async registerUser(req, res, next) {
const trx = await transaction.start(this.User.knex());
let userData = {};
AuthService.hashPassword(req.body.password)
.then(password => {
userData = {
first_name: req.body.firstName,
last_name: req.body.lastName,
email: req.body.email,
password: password,
tenant_id: req.body.tenantId
};
return userData;
}).then(async userData => {
return this.User
.query()
.insert(userData);
})
.then(async user => {
let token = await AuthService.signPayload(user);
return {
token,
user
};
})
.then(async payload => {
await trx.commit();
console.log(payload);
res.status(201);
res.jsonp({
success: true,
data: {
user: payload.user,
token: payload.token
}
});
}).catch(async e => {
await trx.rollback();
console.log(e);
res.status(400);
res.jsonp({
success: false,
errors: true,
data: {
message: 'Registration failed',
user: userData
}
})
});
}
我已经更改了您的代码,使其看起来更加同步,因此您可以看到所有的优点和缺点。
关于性能问题,最好的解决方案是在代码中使用
async/await
。
关于这一点: 我们可以重构这些
const registerUser=(请求、恢复、下一步)=>{
const trx=wait transaction.start(this.User.knex());
输入密码;
试一试{
password=wait AuthService.hashPassword(req.body.password);
}捕获(e){
//一些错误。您可以向用户抛出它或发送消息,或者执行任何您想要的操作。
console.error(“auth错误”,e.message);
返回等待错误事务(res、trx);
}
让用户数据={
名字:req.body.firstName,
姓氏:req.body.lastName,
电子邮件:req.body.email,
密码:密码,
租户id:req.body.tenantId
};
试一试{
等待这个.User.query().insert(userData);
}捕获(e){
控制台错误(“插入时出错”,例如消息);
返回;
}
let token=wait AuthService.signPayload(用户);
让tokenUserData={
代币
用户
};
试一试{
等待trx.commit();
}捕获(e){
console.error(“提交中的错误”,e.message);
返回等待错误事务(res、trx、userData);
}
物质状态(201);
res.jsonp({
成功:没错,
数据:{
用户:payload.user,
令牌:payload.token
}
});
}
const errorTransaction=async(res、trx、userData={})=>{
等待trx.rollback();
物质状态(400);
res.jsonp({
成功:错,
错误:正确,
数据:{
消息:“注册失败”,
用户:userData
}
});
}
我已经更改了您的代码,使其看起来更加同步,因此您可以看到所有的优点和缺点。
关于性能问题,最好的解决方案是在代码中使用
async/await
。
关于这一点: 我们可以重构这些
const registerUser=(请求、恢复、下一步)=>{
const trx=wait transaction.start(this.User.knex());
输入密码;
试一试{
password=wait AuthService.hashPassword(req.body.password);
}捕获(e){
//一些错误。您可以向用户抛出它或发送消息,或者执行任何您想要的操作。
console.error(“auth错误”,e.message);
返回等待错误事务(res、trx);
}
让用户数据={
名字:req.body.firstName,
姓氏:req.body.lastName,
电子邮件:req.body.email,
密码:密码,
租户id:req.body.tenantId
};
试一试{
等待这个.User.query().insert(userData);
}捕获(e){
控制台错误(“插入时出错”,例如消息);
返回;
}
let token=wait AuthService.signPayload(用户);
让tokenUserData={
代币
用户
};
试一试{
等待trx.commit();
}捕获(e){
console.error(“提交中的错误”,e.message);
返回等待错误事务(res、trx、userData);
}
物质状态(201);
res.jsonp({
成功:没错,
数据:{
用户:payload.user,
令牌:payload.token
}
});
}
const errorTransaction=async(res、trx、userData={})=>{
等待trx.rollback();
物质状态(400);
res.jsonp({
成功:错,
错误:正确,
数据:{
消息:“注册失败”,
用户:userData
}
});
}
我理解你想做什么,但在这项工作中你忽略了一些重要的东西,比如在出现异常时不回滚事务,或者始终发送回响应。@robertklep,请向下滚动我的代码片段,这里有try…catch for transaction。关于响应,我刚刚使用了authors代码。您只在trx.commit()
上检查异常,但事务从顶部开始,对于可能发生的每个异常,原始代码的目的是在返回之前回滚事务。另外,原始代码有一个顶级的catch
块,它将处理所有异常、回滚事务并发送回响应。您的代码中缺少了这一点(您正在调用console.log()
并返回,使事务和请求都悬而未决)。@robertklep哦,我明白了。非常感谢。@GayanHewa,正如MDN文档中关于try-catch-try-block的说明,仍然会执行,但若发生错误,则只会执行catch-block。因此,没有try…catch的代码和有try…catch的代码之间没有任何区别,如果您的代码不产生错误。我理解您试图做什么,但在这项工作中您忽略了一些重要的内容,例如在出现异常时不回滚事务,或始终返回响应。@robertklep,请向下滚动我的代码段,这里有try…catch for transaction。关于响应,我刚刚使用了authors代码。您只在trx.commit()
上检查异常,但事务从顶部开始,对于可能发生的每个异常,原始代码的目的是在返回之前回滚事务。另外,原始代码有一个顶级的catch
块,它将处理所有异常、回滚事务并发送回响应。您的代码中缺少了这一点(您正在调用console.log()
并返回,使事务和请求都悬而未决)。@robertklep哦,我明白了。非常感谢。@GayanHewa,正如MDN文档中关于try-catch-try-block的说明,仍然会执行,但若发生错误,则只会执行catch-block。因此,如果您的代码不产生错误,那么不使用try…catch的代码和使用try…catch的代码实际上没有区别。