繁体   English   中英

如果nodejs中的语句没有按顺序执行

[英]If statement in nodejs not executing in order

下面是 controller.js 脚本。 我在 if 循环“if(changeUserToSellerFlag == 1)”中面临 go 的困难时期,因为这个 if 语句的执行时间远早于这个 if 语句“if (results.Name == "Customer")”。 我不确定为什么执行顺序不是逐行完成。

const { updateUserSellerStatus } = require("./seller.model.js");

const { genSaltSync, hashSync } = require("bcrypt");
const userid = require("../auth/token_validation.js");
const {
  updateUserRoleAfterSellerApproval,
  getRoleName,
} = require("../users/user.service.js");

module.exports = {
  sellerVerify: (req, res) => {
    var sellerStatusName;
    var changeUserToSellerFlag = 0; // this flag determines if user to seller update is needed or not

    approvedByName = req.fullName; //get full name from token_validation.js
    approvedByEmail = req.email; //get email from token_validation.js
    console.log("Request body is below");
    console.log(req.body); // contains body sent by postman

    updateUserSellerStatus(
      req.body,
      approvedByName,
      approvedByEmail,
      (err, results) => {
        if (err) {
          console.log(err);
          return res.status(500).json({
            success: 0,
            message: err,
          });
        }
        if (!results) {
          console.log(results);
          return res.json({
            success: 0,
            message: err,
          });
        }

        if (req.body.sellerStatus == 3) {
          sellerStatusName = "Rejected";
        } else if (req.body.sellerStatus == 2) {
          sellerStatusName = "Completed";
        } else if (req.body.sellerStatus == 1) {
          sellerStatusName = "Pending";
        }
        //verify if user is a seller or not
        if (req.userId) {
          getRoleName(req.userId, (err, results) => {
            console.log("check rolename gettign below");
            console.log(results);
            if (results.Name == "Customer") {
              console.log("User is Customer");
              changeUserToSellerFlag = 1;
              console.log("flag is :" + changeUserToSellerFlag);
            } else if (results.Name == "Seller") {
              console.log("User is Seller");
              changeUserToSellerFlag = 0;
            }
            if (err) {
              console.log(err);
              return res.status(500).json({
                success: 0,
                message: err,
              });
            }
          });
        }

        console.log("see flag changed here ", changeUserToSellerFlag);
        if (changeUserToSellerFlag == 1) {
          console.log("i am here");
          //update userrole to seller only if user is not a seller earlier
          updateUserRoleAfterSellerApproval(
            req.userId,
            req.roleId,
            (err, results) => {
              console.log("result details are bwlo");
              console.log(results);
              if (err) {
                console.log(err);
                return res.status(500).json({
                  success: 0,
                  message: err,
                });
              }
              if (!results) {
                console.log(results);
                return res.json({
                  success: 0,
                  message: err,
                });
              }
              console.log("Update into UserRole Completed successfully");
            },
          );
        } else {
          console.log(
            "User is already a seller and dont need to update userrole table",
          );
        }

        console.log(sellerStatusName);
        return res.status(200).json({
          success: 1,
          status: sellerStatusName,
        });
      },
    );
  },
};

下面是控制台 output

Request body is below
{ sellerId: 122, sellerStatus: 2 }
see flag changed here  0
User is already a seller and dont need to update userrole table
Completed
check rolename gettign below
TextRow { Name: 'Customer', RoleId: 2 }
User is Customer
flag is :1

其中“用户已经是卖家,不需要更新用户角色表”在“标志为:1”之前首先执行

对我来说,您似乎将异步代码视为同步代码。 在 function 的顶部,您正在调用异步代码的一部分,例如每个数据库查询通常都是异步调用。

getRoleName(req.userId, (err, results) //i assume this is an async call

进程在继续执行之前不会等待上述代码完成,因为它是同步编写的。 因此,它将执行的下一条指令是:

console.log('see flag changed here ', changeUserToSellerFlag);//0
if(changeUserToSellerFlag == 1)//0 --> false
}else{console.log("User is already a seller and dont need to update userrole table");}//so these 3 orders are executed immediately.

之后来自(我假设)的异步调用

getRoleName(req.userId, (err, results)

将完成并调用正确的回调。

作为一个潜在的解决方案:我要么等待任何数据库调用完成,然后再继续。 您可以使用 async - await 调用,其他解决方案也使用 Promises,当然还有回调地狱。

如果我们使用回调,因为您已经在使用它们,它看起来像这样:

updateUserSellerStatus(
    req.body,
    approvedByName,
    approvedByEmail,
    (err, results) => {
        if (err) {
            console.log(err);
            return res.status(500).json({
                success: 0,
                message: err,
            });
        }
        if (!results) {
            console.log(results);
            return res.json({
                success: 0,
                message: err,
            });
        }

        if (req.body.sellerStatus == 3) {
            sellerStatusName = "Rejected";
        } else if (req.body.sellerStatus == 2) {
            sellerStatusName = "Completed";
        } else if (req.body.sellerStatus == 1) {
            sellerStatusName = "Pending";
        }
        //verify if user is a seller or not
        if (req.userId) {
            getRoleName(req.userId, (err, results) => {
                    console.log('check rolename gettign below');
                    console.log(results);
                    if (results.Name == "Customer") {
                        console.log("User is Customer");
                        changeUserToSellerFlag = 1;
                        console.log("flag is :" + changeUserToSellerFlag);
                    } else if (results.Name == "Seller") {
                        console.log("User is Seller");
                        changeUserToSellerFlag = 0;
                    }

                    console.log('see flag changed here ', changeUserToSellerFlag);
                    if (changeUserToSellerFlag == 1) {
                        console.log("i am here");
                        //update userrole to seller only if user is not a seller earlier
                        updateUserRoleAfterSellerApproval(
                            req.userId,
                            req.roleId,
                            (err, results) => {
                                console.log("result details are bwlo");
                                console.log(results);
                                if (err) {
                                    console.log(err);
                                    return res.status(500).json({
                                        success: 0,
                                        message: err,
                                    });
                                }
                                if (!results) {
                                    console.log(results);
                                    return res.json({
                                        success: 0,
                                        message: err,
                                    });
                                }
                                console.log("Update into UserRole Completed successfully");
                            }
                        );
                    } else {
                        console.log("User is already a seller and dont need to update userrole table");
                    }

                    console.log(sellerStatusName);
                    return res.status(200).json({
                        success: 1,
                        status: sellerStatusName,
                    });
                }


                if (err) {
                    console.log(err);
                    return res.status(500).json({
                        success: 0,
                        message: err,
                    });
                }
            });
    }
);
},
};

我只是移动了下面的代码

console.log('see flag changed here ', changeUserToSellerFlag);

在第一个回调方法中。

我建议将回调地狱的异步性重构为承诺。

令人高兴的是,Node 的util库中的util.promisify让回调异步函数非常容易做到这一点。

你最终会得到这样的结果:

const { promisify } = require("util");
const { updateUserSellerStatus } = require("./seller.model.js");
const userid = require("../auth/token_validation.js");
const {
  updateUserRoleAfterSellerApproval,
  getRoleName,
} = require("../users/user.service.js");

const updateUserSellerStatusP = promisify(updateUserSellerStatus);
const getRoleNameP = promisify(getRoleName);
const updateUserRoleAfterSellerApprovalP = promisify(
  updateUserRoleAfterSellerApproval,
);

async function sellerVerify(req) {
  var sellerStatusName;
  var changeUserToSellerFlag = 0; // this flag determines if user to seller update is needed or not
  switch (req.body.sellerStatus) {
    case 3:
      sellerStatusName = "Rejected";
      break;
    case 2:
      sellerStatusName = "Completed";
      break;
    case 1:
      sellerStatusName = "Pending";
      break;
  }

  const results = await updateUserSellerStatusP(
    req.body,
    req.fullName,
    req.email,
  );
  if (!results) throw new Error("No results from UUSS");

  //verify if user is a seller or not
  if (req.userId) {
    const roleName = await getRoleNameP(req.userId);
    if (roleName.Name === "Customer") {
      changeUserToSellerFlag = 1;
    } else if (roleName.Name === "Seller") {
      changeUserToSellerFlag = 0;
    }
  }

  if (changeUserToSellerFlag) {
    console.log("i am here");
    //update userrole to seller only if user is not a seller earlier
    const results = await updateUserRoleAfterSellerApprovalP(
      req.userId,
      req.roleId,
    );
    console.log(results);
    if (!results) throw new Error("UURASP results missing");
    console.log("Update into UserRole Completed successfully");
  } else {
    console.log(
      "User is already a seller and dont need to update userrole table",
    );
  }

  console.log(sellerStatusName);
  return {
    success: 1,
    status: sellerStatusName,
  };
}

module.exports = {
  sellerVerify: async (req, res) => {
    try {
      const result = await sellerVerify(req);
      return res.json(result);
    } catch (err) {
      console.error(err);
      return res.status(500).json({
        success: 0,
        message: err,
      });
    }
  },
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM