簡體   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