2

申请如下:

首先,我使用带有 express.js 框架的 node.js 应用程序作为 Web 服务器。在前端,当用户通过 POST 表单发送付款时,express.js 通过 'app.post' 路由此任务并调用外部 API 进行付款。理想情况下,此 API 请求应返回应重定向用户以进行付款的 URL。然后,express.js 应该通过“app.post”响应变量(res)重定向用户:

res.redirect(307, url);

由于此支付 API 请求需要一些时间,而且我使用的是 Heroku,因此 API 请求超时并返回错误。为了解决这个问题,我知道我需要在一个工作者 Heroku 插件上设置一个工作者(根据https://stackoverflow.com/a/11438381/2859410),例如 IronWorker。但是,我无法理解将工作人员中发出的外部 API 请求返回的 URL 传递回 node.js 应用程序的正确机制是什么。

为了让事情更清楚: - 用户提交付款表格。
- node.js 应用程序处理 POST 数据并调用工作人员(在工作人员上“排队”任务)。
- 工作人员请求一个外部支付 API,该 API 返回一个 URL。
- 工作人员应将此 URL 传达回 node.js 应用程序。
- node.js 应用程序应接收此 URL 并重定向用户。
然而,这些操作必须是非阻塞的。

我可以想到 2 种通信替代方案:
替代方案 1 - 当前端用户通过 POST 请求付款时,node.js 应用程序调用特定的工作人员(也通过 POST),并将付款数据作为有效负载。Worker 处理数据,请求支付 API 并获取支付 URL。同时,node.js 对工作状态进行轮询,并在收到“已完成”状态时重定向用户。
谬误:对我来说,这里的困难是以异步方式执行持续轮询。由于我需要将用户重定向到支付 URL,因此我需要在“app.post('/form', function(req,res) {”方法中包含 URL,以便我可以响应 (“res ") 来重定向用户。为此,我查看了 async.whilst(test, fn, callback),但我不知道如何使用同步的测试函数。我的直接想法是测试发出状态请求的函数和重定向用户的回调函数。但是,此测试函数是异步操作(例如使用“请求”模块)。

备选方案 2 - 工作人员还接收支付数据作为有效负载,处理数据,请求支付 API 并获取支付 URL。完成后,它会通过 HTTP 请求将 URL 传送回 node.js 应用程序。
谬误:我如何将返回给 node.js 应用程序的 URL 与请求付款的用户联系起来?在我的理解中,带有支付 URL 的 HTTP 请求将有一个独立的路由,而不是表单 POST 路由。换句话说,这样我将无法在“app.post('/orderform', function(req,res) {”方法中使用支付 URL,因此无法使用响应变量("res") 重定向用户。

Tha node.js 应用程序的结构如下:

app.post('/order', function(req, res) {  
    // user data on req.body
    // process data and request payment API  
    // Wait until URL is communicated to the endpoint belo '/url'
    // receive URL from the other endpoint and redirect user
}

app.post('/url', function(req, res) {  
    // receive payment URL on req.body
    // communicate the URL to the '/order/ endpoint    
}

在这种情况下会推荐什么?

提前致谢。

4

2 回答 2

2

我建议为此使用 pubnub 之类的服务 ( http://www.pubnub.com/ )。当您收到来自用户的请求时,将其添加到队列中以对其进行处理并创建并返回一个令牌以识别此工作请求。将该令牌发送回客户端。使用该令牌作为 pubnub 频道进行收听。当工作人员完成时,向同一个令牌发送一条消息,让客户端知道工作已经完成。

于 2014-04-22T18:48:01.187 回答
1

我建议在这两种选择之间使用一些东西。

  1. 您收到来自用户和队列工作人员的请求来处理它。
  2. 您开始轮询一些内部存储(例如数据库)以获取请求的结果。
  3. 当工作人员需要存储结果时,它会回调您的应用程序(不同的端点),该应用程序将数据存储在本地存储(轮询操作查找它的地方)中。
  4. 当数据可用时,您将能够重定向用户。
于 2013-12-31T05:22:04.243 回答