node.js - 如何将信息发送回前端,运行由 webhook 触发的函数?

标签 node.js express asynchronous webhooks

我正在使用 Plaid API 从注册用户那里收集交易数据。本质上,Plaid 需要检索我们的 webhook 端点的更新,以便让服务器知道何时可以提取数据。当所需的代码从 Plaid 发送到该端点时,我们将知道交易数据已准备好检索,我们的后端将开始将其插入到我们的数据库中。

我们遇到的问题是如何将数据发送到前端。由于我们只在数据准备好从网络钩子(Hook)端点上的 Plaid 中提取数据时收到警报,因此任何 res.send 都会转到 Plaid。如果我们有另一个端点来获取新插入的数据,用户将能够在 Webhook 操作发生之前点击该端点。

我们有点卡住了。我们可以让 webhook 触发我们需要触发的操作,但是一旦触发后将其发送回用户是另一个问题。在将数据发送回前端之前,有没有让我们的第三个端点等待第二个端点完成?

这是端点 1,它触发 Plaid 将他们的 webhook 发送到 out 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;
      }),
    );

  } 

这是端点 3,它是我们的 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 被触发时尝试推送到客户端 - 您可以:

  • 存储 res来自端点一的对象(不确定如何将 Webhook 调用映射到初始请求)。一旦 Webhook 被触发,查找 res对象并关闭初始请求。这不太理想。如果 Webhook 在初始请求套接字关闭之前未能触发,或者如果您需要扩展应用程序 - 它不会扩展,因为您将始终需要在引用打开套接字的同一应用程序中调用 Webhook。
  • 使用 Websocket。保持对客户端的持久连接打开,并在 webhook 调用时推送通知。
  • 关于node.js - 如何将信息发送回前端,运行由 webhook 触发的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996265/

    相关文章:

    node.js - 使用 $min 选择字段的最小值并在 mongodb 中聚合

    node.js - 在 express js 和 socket.io 中使用路由,一般情况下可能使用 Node

    c# - 将 PLINQ 与异步方法相结合

    c - linux异步串口编程中如何区分读和写

    sql - Postgres Async API 检测查询结束

    node.js - 使用 sequelize 根据 id 更新行的值会产生 404 错误

    node.js - ts-node 将选项传递给 Node

    javascript - gulp-useref – 不同级别文件夹中的相对输出路径

    Heroku 上的 Node.js Socket.io 抛出 H13

    node.js - Express 4 中的 locals.pretty