1

这是我的 API 函数之一;如果我连续调用这个函数。仅显示加载的 api。没有得到任何回应..然后我的日志出现 502 错误

错误服务{“错误”:“超出上下文截止日期”,“errorVerbose”:“超出上下文截止日期\ngithub.com/ory/graceful.Graceful.func1\

我正在使用 go-gin

我不明白我的代码中有什么问题..

例如,我可以调用 API 5 次然后显示结果。然后在第 6 次加载。它是一个获取功能

我找不到根本原因。

附上我的api函数:

func (ser *service) GetPlaidUserInstitutionAccounts(ctx context.Context, impartWealthId string) (UserAccount, impart.Error) {

    _, err := dbmodels.Users(dbmodels.UserWhere.ImpartWealthID.EQ(impartWealthId)).One(ctx, ser.db)
    if err != nil {
        impartErr := impart.NewError(impart.ErrBadRequest, "Could not find the user.")
        ser.logger.Error("Could not find the user institution details.", zap.String("User", impartWealthId),
            zap.String("user", impartWealthId))
        return UserAccount{}, impartErr
    }

    userInstitutions, err := dbmodels.UserInstitutions(dbmodels.UserInstitutionWhere.ImpartWealthID.EQ(impartWealthId),
        qm.Load(dbmodels.UserInstitutionRels.ImpartWealth),
        qm.Load(dbmodels.UserInstitutionRels.Institution),
    ).All(ctx, ser.db)

    if len(userInstitutions) == 0 {
        return UserAccount{}, impart.NewError(impart.ErrBadRequest, "No records found.")
    }
    if err != nil {
        impartErr := impart.NewError(impart.ErrBadRequest, "Could not find the user institution details.")
        ser.logger.Error("Could not find the user institution details.", zap.String("User", impartWealthId),
            zap.String("user", impartWealthId))
        return UserAccount{}, impartErr
    }

    configuration := plaid.NewConfiguration()
    cfg, _ := config.GetImpart()
    if cfg != nil {
        configuration.AddDefaultHeader("PLAID-CLIENT-ID", cfg.PlaidClientId)
        configuration.AddDefaultHeader("PLAID-SECRET", cfg.PlaidSecret)

        if cfg.Env == config.Production {
            configuration.UseEnvironment(plaid.Production)
        } else if cfg.Env == config.Preproduction {
            configuration.UseEnvironment(plaid.Development)
        } else {
            configuration.UseEnvironment(plaid.Sandbox)
        }

    }
    client := plaid.NewAPIClient(configuration)

    userData := UserAccount{}
    userData.ImpartWealthID = impartWealthId
    userData.UpdatedAt = time.Now().UTC().Unix()
    userinstitution := make(UserInstitutions, len(userInstitutions))
    finalQuery := ""
    for i, user := range userInstitutions {
        institution := InstitutionToModel(user)
        accountsGetRequest := plaid.NewAccountsGetRequest(user.AccessToken)
        accountsGetResp, response, err := client.PlaidApi.AccountsGet(ctx).AccountsGetRequest(
            *accountsGetRequest,
        ).Execute()

        if response.StatusCode == 400 {
            // defer response.Body.Close()
            bodyBytes, _ := ioutil.ReadAll(response.Body)
            type errorResponse struct {
                ErrorCode string `json:"error_code" `
            }
            newRes := errorResponse{}
            err = json.Unmarshal(bodyBytes, &newRes)
            if err != nil {
                fmt.Println(err)
            }
            if newRes.ErrorCode == "ITEM_LOGIN_REQUIRED" {
                institution.IsAuthenticationError = true
            }
        }
        if err != nil {
            ser.logger.Error("Could not find the user plaid account details.", zap.String("User", impartWealthId),
                zap.String("token", user.AccessToken))
            continue
        }
        accounts := accountsGetResp.GetAccounts()
        userAccounts := make(Accounts, len(accounts))
        query1 := ""
        query := ""
        logwrite := false
        for i, act := range accounts {
            userAccounts[i], query1 = AccountToModel(act, user.UserInstitutionID)
            query = fmt.Sprintf("%s %s", query, query1)
            logwrite = true
        }
        institution.Accounts = userAccounts
        userinstitution[i] = institution
        userData.Institutions = userinstitution

        if logwrite {
            finalQuery = fmt.Sprintf("%s %s", finalQuery, query)
        }
    }
    if finalQuery != "" {
        go func() {
            lastQuery := "INSERT INTO `user_plaid_accounts_log` (`user_institution_id`,`account_id`,`mask`,`name`,`official_name`,`subtype`,`type`,`iso_currency_code`,`unofficial_currency_code`,`available`,`current`,`credit_limit`,`created_at`) VALUES "
            lastQuery = fmt.Sprintf("%s %s", lastQuery, finalQuery)
            lastQuery = strings.Trim(lastQuery, ",")
            lastQuery1 = fmt.Sprintf("%s ;", lastQuery)
            ser.logger.Info("Query", zap.Any("Query", lastQuery1))
            _, err = queries.Raw(lastQuery1).QueryContext(ctx, ser.db)
            if err != nil {
                ser.logger.Error("error attempting to  log in user_plaid_accounts_log ", zap.Any("user_plaid_accounts_log", lastQuery1), zap.Error(err))
            }
        }()
    }
    return userData, nil
}

在这里我在 main.go 中遇到错误

if err := graceful.Graceful(server.ListenAndServe, server.Shutdown); err != nil {
        logger.Fatal("error serving", zap.Error(err))
    }
4

0 回答 0