1

下の .gif でわかるように、データベースを初めて呼び出すと、データが正常に返されます。しかし、次の 2 回は戻りもエラーも発生せず、非同期コードは単純に消えます。さらに悪いことに、私の await ステートメントは応答を待たず、そのまま続行します。

Sequelize への後続の呼び出しが消える理由を誰か教えてもらえますか? さらに重要なのは、私が使用したにもかかわらず、呼び出し元のコードが実行され続けるのはなぜawaitですか?

ここに画像の説明を入力

最も内側のコードは次のとおりです。

getRolesAndPermissionsForUser(userId: string): Promise<[IRoleModel]> {
    return new Promise<[IRoleModel]>( async (resolve: any, reject: any) => {
      try {
        const rows = await this._db.getSequelize().transaction( (transaction) => {
          return this._db.getSequelize().query(getRolesAndPermissionsForUserSql, { type: Sequelize.QueryTypes.SELECT, replacements: [userId]  });
        })
        resolve(this.convertRolesToTree(rows));
      }
      catch (error) { reject(error); }
    });
  }

呼び出し元:

async function hasPermission(hapiResolve: (response: any) => void, requestingUserId: string, requestedUserId: string, requestedUsersRoles: any[]): Promise<boolean> {
      return new Promise<boolean>( (resolve, reject) => {
        try {
          //user is seeng her own roles
          let result = (requestingUserId === requestedUserId);

          //user manages a franchisor the requestee is part of
          if (!result) {
            requestedUsersRoles.forEach( async (role) => {
              if (!result) { //may have found it last iteration
                const userHasOrgPermission = await self._bouncer.doesUserHavePermission(null, requestingUserId, DatabaseIds.enum__permissions__canViewAllRolesOfAnyUseratThisFranchisor, role.franchisorId, null)
                if (userHasOrgPermission) result = true;
              }
            })
          }

          //user manages a franchisee the requestee is part of
          if (!result) {
            requestedUsersRoles.forEach( async (role) => {
              if (!result) { //may have found it last iteration
                const userHasOrgPermission = await self._bouncer.doesUserHavePermission(null, requestingUserId, DatabaseIds.enum__permissions__canViewAllRolesOfAnyUseratThisFranchisor, null, role.franchiseeId)
                if (userHasOrgPermission) result = true;
              }
            })
          }

          if (!result)
            hapiResolve(responseHelper.getErrorResponse(ResponseErrorCode.notAuthorised));
          resolve(result);
        }
        catch (error) {
          console.trace(error);
          reject(error);
        }
      });
    }

  doesUserHavePermission(hapiResolve: (response: any) => void, userId: string, permissionId: string, franchisorId: string, franchiseeId: string): Promise<boolean> {
    return new Promise<boolean>( async (resolve, reject) => {
      try {
        const roles = await this._rolesQueries.getRolesAndPermissionsForUser(userId);
                if (!this.doRolesHavePermission(roles, permissionId, franchisorId, franchiseeId)) {
          if (hapiResolve)
            hapiResolve(responseHelper.getErrorResponse(ResponseErrorCode.notAuthorised));
          resolve(false);
        }
        else resolve(true);
            }
      catch (error) {
        if (hapiResolve)
                hapiResolve(responseHelper.getErrorResponse(ResponseErrorCode.unknownError));
                reject(error);
            }
        });
  }
4

0 に答える 0