Не удается обновить Mon go Collection в Meteor из функции - PullRequest
0 голосов
/ 18 июня 2020

У меня настроен веб-перехватчик, который находится в import / api моего приложения. Это веб-перехватчик Stripe, и я пытаюсь обновить коллекцию Campaign. Я использую метод Meteor для этого вызова, но ничего не происходит. Если я добавлю к нему обратный вызов, я не получу ни ошибки, ни результатов. Однако, если я возьму тот же метод Meteor и включу его в main. js на сервере в функции запуска Meteor, он будет работать нормально. Я также пробовал просто использовать функцию обновления для коллекции, и она тоже не сработает. Main. js включает в себя этот файл, и я не могу понять, почему это не работает, и что pu sh не будет ошибкой. Самая важная часть этой строки - это нижняя часть, где Paid == true, это где logi c. Консоль выдаст информацию, но метод не запустится. В чем может быть проблема?

import bodyParser from 'body-parser';
import { Picker } from 'meteor/meteorhacks:picker';
import {Campaign} from '../api/campaigns';

let campaignID;
let chargeAmount;
let chargeID;
let hasPaid = false;

//This will run outside the updateCampaign function fine and works as expected
Campaign.update({_id: "BAxBhk4ae3AdHxxEQ"}, {$set: {chargeTrx: "chargeID", amount: "555"}});


function updateCampaign(){

  //these consoles will print and prove the function runs
  console.log('campaignID type:' +  campaignID)
  console.log('chargeIDtype:' +  chargeID)
  console.log('amount type:' +  chargeAmount)

  //doesn't work even with strings prefilled
  Campaign.update({_id: "BAxBhk4ae3AdHxxEQ"}, {$set: {chargeTrx: "chargeID", amount: "333"}});

  //This didn't run either but would run outside of this function
  Meteor.call("updateCampaignForPayment", campaignID, chargeAmount, chargeID, (err, result) => {
    if (err){
      console.log('error')
    }
  });



}

// Middleware declaration
Picker.middleware(bodyParser.json({
  limit: '10MB',
  verify: function(req,res,buf) {
    var url = req.originalUrl;
    if (url.startsWith('/webhook')) {
      req.rawBody = buf.toString();
      let newResponse = req.rawBody;   

      //stripe returns to 2 objects, this makes it two arrays to parse it
      let parsedResponse = JSON.parse('[' + newResponse.replace(/}{/g, '},{') + ']');
      parsedResponse = parsedResponse[0].data.object;

      //break down two further objects
      if (parsedResponse.object == "charge"){
        chargeID = parsedResponse.id;
        hasPaid = parsedResponse.paid;
        chargeAmount = parsedResponse.amount / 100;
      }
      else if (parsedResponse.object == "checkout.session"){
        let campaignIDArray = parsedResponse.success_url.split('/');
        campaignID = campaignIDArray[5];
      }
      // If user has paid, update campaign
      if (hasPaid == true && chargeID && campaignID && chargeAmount){
        console.log(hasPaid, chargeID, campaignID, chargeAmount)
        //
        updateCampaign();
      }
    }
  }
}));

1 Ответ

2 голосов
/ 18 июня 2020

Любые вызовы вне текущей среды Meteor (например, в функциях обратного вызова или обработчиках промежуточного программного обеспечения) к конструкции, для которой требуется среда Meteor, должны быть связаны с использованием среды Meteor.

В вашем случае это кажется быть updateCampaign, потому что он вызывает Meteor-Mon go Collection:

const updateCampaign = Meteor.bindEnvironment(function () {
  const updated = Campaign.update({_id: "BAxBhk4ae3AdHxxEQ"}, {$set: {chargeTrx: "chargeID", amount: "333"}});

  const callResult = Meteor.call("updateCampaignForPayment", campaignID, chargeAmount, chargeID);
})

Обратите внимание, что коллекция внутри этой функции выполняется в асинхронном c режиме и только внутри Код среды Meteor, вы можете написать код в формате syn c и позволить ему обрабатывать asyn c. Вы всегда можете «дождаться» результата, используя async/await:

function async updateCampaign(){
  const updated = await Campaign.update({_id: "BAxBhk4ae3AdHxxEQ"}, {$set: {chargeTrx: "chargeID", amount: "333"}});

  //This didn't run either but would run outside of this function
  const callResult = await Meteor.call("updateCampaignForPayment", campaignID, chargeAmount, chargeID);
}

или Promise.await, если вы хотите избежать async/await:

function updateCampaign(){
  const updated = Promise.await(Campaign.update({_id: "BAxBhk4ae3AdHxxEQ"}, {$set: {chargeTrx: "chargeID", amount: "333"}}))

  //This didn't run either but would run outside of this function
  const callResult = Promise.await(Meteor.call("updateCampaignForPayment", campaignID, chargeAmount, chargeID))
}

Readings :

https://guide.meteor.com/using-npm-packages.html#bind -среда

https://docs.meteor.com/api/methods.html#Meteor -вызов

https://guide.meteor.com/using-npm-packages.html#promises

https://github.com/meteor/meteor/tree/devel/packages/promise

...