Node.js 异步等待性能命中

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 =

对于下面的express控制器方法,嵌套了一些异步等待,它会有任何性能影响吗

为了简单起见,所有逻辑当前都位于控制器方法中。但我很清楚我可以重构这些

我在一些promise解决方案上使用了async。在高层。我不确定这是否会显著降低性能,或者这是否是一种有争议的做法

  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的代码实际上没有区别。