当前位置: 首页 > 知识库问答 >
问题:

在示例节点中创建客户配置文件的异步问题。JS代码

濮君植
2023-03-14

我们的目标是整合。NET引入我们的应用程序,使用Node SDK示例代码。

节点SDK:https://github.com/AuthorizeNet/sdk-node

推荐的示例代码:https://github.com/AuthorizeNet/sample-code-node/tree/ef9e5c2d9e0379b5f47a0ebcb6847e711fe196ef

我试图创建一个客户支付配置文件和虽然我能够创建一个客户配置文件成功并收到一个成功的响应从API调用

我知道这是一个与我的代码同步的问题,但是我不知道如何解决这个问题。我正在使用示例代码授权。NET提供的,但是代码使用的是我的应用程序中的真实数据,而不是示例数据。我非常乐意应要求提供进一步的信息,非常感谢任何帮助!

// AUTH.CONTROLLER.JS
const httpStatus = require("http-status");
const ApiContracts = require("authorizenet").APIContracts;
const ApiControllers = require("authorizenet").APIControllers;
const SDKConstants = require("authorizenet").Constants;
const User = require("../models/user.model");
const RefreshToken = require("../models/refreshToken.model");
const moment = require("moment-timezone");
const { jwtExpirationInterval } = require("../../config/vars");
const sgMail = require("@sendgrid/mail");
const bcrypt = require("bcryptjs");
const CustomerProfilesModule = require("../utils/authorizeNet/CustomerProfiles");

sgMail.setApiKey(process.env.SENDGRID_API_KEY.replace(/\r?\n|\r/g, ""));

exports.register = async (req, res, next) => {
  try {
    const userData = req.body;

    let customerProfileResult =
      await CustomerProfilesModule.createCustomerProfile(userData);
    console.log(
      "❌ ❌ ❌ ❌ ❌ customerProfile Result ",
      customerProfileResult
    );

    if (!userData || userData.error) {
      return next(error);
    } else {
      const { isTrial } = userData;

      const user = await new User(userData).save();

      const token = generateTokenResponse(user, user.token());


      res.status(httpStatus.CREATED);
      return res.json({ token, user });
    }
  } catch (error) {
    console.log(error.message);
    return next(User.checkDuplicateEmail(error));
  }
};



//////////



// CREATE-CUSTOMER-PROFILE.JS 
var ApiContracts = require("authorizenet").APIContracts;
var ApiControllers = require("authorizenet").APIControllers;
var utils = require("../utils.js");

async function createCustomerProfile(user) {
  console.log(" user parameter", user);
  var merchantAuthenticationType =
    new ApiContracts.MerchantAuthenticationType();
  merchantAuthenticationType.setName(process.env.AUTHORIZE_NET_API_LOGIN_KEY);
  merchantAuthenticationType.setTransactionKey(
    process.env.AUTHORIZE_NET_TRANSACTION_KEY
  );

  var creditCard = new ApiContracts.CreditCardType();
  creditCard.setCardNumber(user.cardNumber);
  if (user.cardExpiry.length > 4) {
    creditCard.setExpirationDate(
      `${user.cardExpiry.slice(0, 1)}${user.cardExpiry.slice(3, 4)}`
    );
  } else {
    creditCard.setExpirationDate(user.cardExpiry);
  }

  console.log("creditCard", creditCard);

  var paymentType = new ApiContracts.PaymentType();

  paymentType.setCreditCard(creditCard);

  var customerAddress = new ApiContracts.CustomerAddressType();

  customerAddress.setFirstName(user.firstName);
  customerAddress.setLastName(user.lastName);
  customerAddress.setAddress(user.mailingAddress);
  customerAddress.setCity(user.mailingCity);
  customerAddress.setState(user.mailingState);
  customerAddress.setZip(user.mailingZip);
  customerAddress.setCountry("USA");
  customerAddress.setPhoneNumber(user.userPhone);

  var customerPaymentProfileType =
    new ApiContracts.CustomerPaymentProfileType();
  customerPaymentProfileType.setCustomerType(
    ApiContracts.CustomerTypeEnum.INDIVIDUAL
  );
  customerPaymentProfileType.setPayment(paymentType);
  customerPaymentProfileType.setBillTo(customerAddress);

  var paymentProfilesList = [];
  paymentProfilesList.push(customerPaymentProfileType);
  console.log(
    "paymentProfilesList",
    paymentProfilesList
  );

  var customerProfileType = new ApiContracts.CustomerProfileType();
  customerProfileType.setMerchantCustomerId(
    "M_" + utils.getRandomString("cust")
  );
  customerProfileType.setDescription(
    `${user.firstName} ${user.lastName}'s Account'`
  );
  customerProfileType.setEmail(user.userEmail);
  customerProfileType.setPaymentProfiles(paymentProfilesList);

  var createRequest = new ApiContracts.CreateCustomerProfileRequest();
  createRequest.setProfile(customerProfileType);
  createRequest.setValidationMode(ApiContracts.ValidationModeEnum.TESTMODE);
  createRequest.setMerchantAuthentication(merchantAuthenticationType);

  var ctrl = new ApiControllers.CreateCustomerProfileController(
    createRequest.getJSON()
  );

  // All above code is ran when  CustomerProfilesModule.createCustomerProfile(userData) is executed in auth.controller.js
  // However the following line (line 130 in auth.controller.js) is ran before the below ctrl.execute() code is completed
  //
  //    console.log("❌ ❌ ❌ ❌ ❌ customerProfile Result ", customerProfileResult);
  //
  // All the above code is executed before that console.log("❌ ❌ ❌") statement above, however the below code doesn't run before that console.log
  // I'd like the below code to execute before the remaining register route is finished, but just don't know what is going on!

  ctrl.execute(async function () {
    var apiResponse = await ctrl.getResponse();
    console.log("apiResponse", apiResponse);

    var response = new ApiContracts.CreateCustomerProfileResponse(apiResponse);
    console.log("response", response);

    //pretty print response
    //console.log(JSON.stringify(response, null, 2));

    if (response != null) {
      if (
        response.getMessages().getResultCode() ==
        ApiContracts.MessageTypeEnum.OK
      ) {
        console.log(
          "Successfully created a customer profile with id: " +
            response.getCustomerProfileId()
        );
      } else {
        console.log("Result Code: " + response.getMessages().getResultCode());
        console.log(
          "Error Code: " + response.getMessages().getMessage()[0].getCode()
        );
        console.log(
          "Error message: " + response.getMessages().getMessage()[0].getText()
        );
        return {
          error:
            "Error message: " +
            response.getMessages().getMessage()[0].getText(),
        };
      }
    } else {
      console.log("Null response received");
      return { error: "Null response received" };
    }
  });
}

module.exports.createCustomerProfile = createCustomerProfile;

共有2个答案

仲孙诚
2023-03-14

我不完全理解你的代码,不知道你希望它如何工作。但是从我对控制台的理解来看。log在从api获得调用和获得api之后运行,使其处于一个尴尬的阶段。

异步代码的工作原理是,JavaScript将允许异步函数运行、离开、同时执行其他操作,并在完成后返回。

我看到的代码问题是,createCustomerProfile完成后不会返回任何内容。你有一个函数,返回一个无效的promise。首先,这是一个问题,因为您正在控制台中使用函数的返回值。log()

我强烈建议promisify,这样它就可以正确地解决或有一个错误,当您使用应用编程接口时,您可能会遇到想要处理的潜在错误。

你说的是控制台。log()ctrl之前被调用。execute()但我甚至看不到它在哪里执行,因为我在createCustomerProfile函数中看不到它。

劳和歌
2023-03-14

ctrl。execute是一种处理未调用的IIFE函数的方法。IIFE函数一经定义就被调用。

在申报前你将无法运行生命。

可能的解决方案:

尝试在寄存器路由内创建回调路由,然后在实际路由完成之前排除IIFE,以从寄存器内的回调中获取响应。

 类似资料:
  • 我在node js Express中面临一个问题[因为我是node js的新手]。我的用例是我有三个目录[根目录、路由、html文件]。在根目录中,我有一个包含端口信息的index.js文件,在routes目录中,有一个用于提及API的所有路由的route文件。在html文件中,我有静态html文件+client.js文件。当我转到/api/getlist路由时,我正在发送一个html文件。在该h

  • 当我用我的节点运行MongoDB连接时。js应用程序哪个游戏平台我在这里面临着越来越多的MongoDB连接的问题[不使用任何查询,但它不断增加],达到819,我的MongoDB复制服务器停止响应,间接应用程序停止工作。但是我想保持至少20个关于如何解决这些问题的联系,请帮助我。 ** Mongodb连接:const connectionString=mongodb://AAAA:PASSWORD@

  • 当我尝试使用node js创建grpc客户端调用时,我遇到了一个问题。当我在proto文件中使用“google/api/annotations.proto”时,我得到一个错误。如果我删除它,它会工作文件。我可以知道我从我的客户那里错过了什么吗。js公司 错误:无法解析的扩展:“扩展google”。protobuf。中的MethodOptions。谷歌。根目录下的api。resolveAll(src

  • 问题内容: 我想为我的PHP项目创建一个配置文件,但是我不确定执行此操作的最佳方法是什么。 到目前为止,我有3个想法。 1用途变量 2用建筑 3用途数据库 我将在类中使用config,因此我不确定哪种方法是最佳方法,或者是否有更好的方法。 问题答案: 一种简单而优雅的方法是创建一个仅返回数组的文件(或您所谓的文件): 然后:

  • 问题内容: 我有下面的代码: 有谁对我如何延迟循环中的每个循环的建议?假设代码在每次迭代完成后等待10秒。我试过了,但没有设法解决。 问题答案: 您可以设置超时时间,以增加代码间隔,如下所示: 因此,第一个立即运行(间隔* 0为0),第二个在十秒钟后运行,依此类推。 您需要在中作为最终参数发送,以便将其值绑定到function参数。否则,尝试访问数组值将超出范围,您将获得。

  • 问题内容: 我在Django中有一个扩展的UserProfile模型: 还有一个signal.py: 我通过在我的:中确保信号被注册: 因此,应该为每个注册用户创建一个新的UserProfile,对吗?但事实并非如此。尝试登录时,总是出现“ UserProfile匹配查询不存在”错误,这意味着该数据库条目不存在。 我应该说我使用django-registration,它提供了user_regist