Как отправить информацию обратно в интерфейс, ПОСЛЕ запускаются функции, вызванные веб-крючком? - PullRequest
0 голосов
/ 31 января 2020

Я использую Plaid API для сбора данных транзакций от зарегистрированных пользователей. По сути, Plaid необходимо получить обновления для нашей конечной точки webhook, чтобы сервер знал, когда данные готовы к извлечению. Когда требуемый код будет отправлен из Plaid в эту конечную точку, мы узнаем, что данные транзакции готовы к получению, наш бэкэнд, и начнем вставлять их в нашу базу данных.

Проблема, с которой мы столкнулись, заключается в том, как отправить эти данные во внешний интерфейс. Поскольку мы получаем уведомление только о том, когда данные будут готовы к извлечению из Plaid в конечной точке webhook, любой res.send будет просто go в Plaid. И если у нас будет другая конечная точка для получения вновь вставленных данных, пользователь сможет выполнить эту задачу до того, как будут выполнены действия Webhook.

Мы застряли. Мы можем заставить webhook запускать действия, которые нам нужны, но отправка его обратно пользователю после его запуска является другой проблемой. Есть ли в любом случае, чтобы наша третья конечная точка ожидала завершения второй, прежде чем отправлять данные обратно во внешний интерфейс?

Это точка 1, она запускает Plaid для отправки своего веб-крюка на конечную точку веб-крюка.

router.post('/token_exchange', publicTokenExists, async (req, res) => {
  const {publicToken} = req.body;
  const {userid} = req.body;

  try {
    const {access_token} = await client.exchangePublicToken(publicToken);

    const Accessid = await qs.add_A_Token(access_token, userid);

    const {item} = await client.getItem(access_token);

    const Itemid = await qs.add_An_Item(item.item_id, userid);

    res.status(201).json({
      accessCreated: Accessid,
      ItemCreated:Itemid
    });
  } catch (err) {
    console.log('access', err);
  }
});

Это конечная точка 2, конечная точка webhook. First Plaid отправляет запрос post с объектом, который мы игнорируем, потому что webhook_code не тот, на котором мы хотим, чтобы действие выполнялось. второй прошел условие ниже

router.post('/webhook', async (req,res)=>{
  const body = req.body;
  console.log("THE WEBHOOK BRUH",body)

  if(body.webhook_code==="HISTORICAL TRANSACTIONS"){
    const A_token = await  qs.GetAccessTokenThatsConnectedTo(body.item_id)

    const {transactions} = await client.getTransactions(A_token)

        const done = Promise.all(
        transactions.map(async trans => {
        const contents = await qs.insert_transactions(trans);
        return trans;
      }),
    );

  } 

Это конечная точка 3, именно там наш React-front-end запрашивает нашу базу данных для транзакций.

router.post('/transactions',checkAccessToken, async (req,res)=>{

  console.log("the request body", req.body)

  const access = req.body.access

  try{

const {transactions} = await qs.getTransactionsDataBaseThatWeInsertedInFunctiontwo
(access,'2019-01-01','2019-01-30')

res.status(200).json({transactions})
  }catch(err){
console.log(err)
res.status(500).json({message:"error sending transactions"})
  }

})

Так что я думаю Я ищу любое решение:

Можно ли отправить вставленные данные транзакции после завершения в методе 2?

Возможно ли, чтобы метод 3 дождался завершения метода 2, я был изначально думал о том, чтобы сделать его функцией промежуточного программного обеспечения, но я не думаю, что это решило бы проблему ответа, возвращающегося к пледу, а не реакции?

...