申请如下:
首先,我使用带有 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
}
在这种情况下会推荐什么?
提前致谢。