如何在 Webhook 触发的函数运行后将信息发送回前端?

4
我正在使用Plaid API收集已注册用户的交易数据。基本上,Plaid需要向我们的Webhook端点检索更新,以便让服务器知道何时可以拉取数据。当从Plaid发送所需代码到该端点时,我们将知道交易数据已准备好进行检索,后端将开始将其插入我们的数据库。
我们遇到的问题是如何将数据发送到前端。由于我们只能在Webhook端点上获得从Plaid获取数据的准备就绪通知,任何res.send都会被发送到Plaid。如果我们有另一个端点来获取新插入的数据,那么在Webhook操作发生之前,用户就可以访问它。
我们有些困惑。我们可以使Webhook触发我们需要触发的操作,但是一旦触发,将其发送回到用户那里是另一个问题。是否有任何方法可以使第三个端点在发送数据回前端之前等待第二个端点完成?
这是端点1,它会触发Plaid将其Webhook发送到我们的Webhook端点。
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 终端点。首先,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;
      }),
    );

  } 

这是第三个端点,它被用于React前端请求数据库的交易数据。

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完成,我最初考虑将其作为中间件函数,但我认为这不会消除响应返回到Plaid而不是React的问题?


我认为如果你在webhook触发后尝试向客户端推送,你可以: - jeeves
2个回答

1
该文本的翻译如下:

Plaid API 文档提供了一个Plaid Pattern 代码库作为处理交易 Webhooks 的示例。在这个示例中,他们使用 WebSockets(Socket.IO)来通知前端。

const handleTransactionsWebhook = async (requestBody, io) => {
  const {
    webhook_code: webhookCode,
    item_id: plaidItemId,
    new_transactions: newTransactions,
    ...
  } = requestBody;

  const serverLogAndEmitSocket = (additionalInfo, itemId) => {
    console.log(
      `WEBHOOK: TRANSACTIONS: ${webhookCode}: Plaid_item_id ${plaidItemId}: ${additionalInfo}`
    );
    // use websocket to notify the client that a webhook has been received and handled
    if (webhookCode) io.emit(webhookCode, { itemId });
  };

  switch (webhookCode) {
    ...
    case 'HISTORICAL_UPDATE': {
      // Fired when an Item's historical transaction pull is completed. Plaid fetches as much
      // data as is available from the financial institution.
      const startDate = moment().subtract(2, 'years').format('YYYY-MM-DD');
      const endDate = moment().format('YYYY-MM-DD');
      await handleTransactionsUpdate(plaidItemId, startDate, endDate);
      const { id: itemId } = await retrieveItemByPlaidItemId(plaidItemId);
      serverLogAndEmitSocket(`${newTransactions} transactions to add.`, itemId);
      break;
    }
    ...
  }
}
  useEffect(() => {
    socket.current = io(`localhost:${REACT_APP_SERVER_PORT}`);

    ...

    socket.current.on('HISTORICAL_UPDATE', ({ itemId } = {}) => {
      const msg = `New Webhook Event: Item ${itemId}: Historical Transactions Received`;
      console.log(msg);
      toast(msg);
      getTransactionsByItem(itemId, true);
    });

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - user17242583

0

我认为如果你尝试在Webhook触发后推送到客户端,你可以:

  1. 存储从Endpoint 1返回的res对象(不确定如何将Webhook调用映射到初始请求)。一旦Webhook被触发,查找res对象并关闭初始请求。这不是最理想的方案。如果Webhook在初始请求套接字关闭之前未能触发,或者如果需要扩展应用程序,则无法扩展,因为您始终需要在开放套接字的同一应用程序中调用Webhook。

  2. 使用Websockets。保持与客户端的持久连接,并在Webhook调用时推送通知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接