【问题标题】:Forwarding an image upload request to another server将图像上传请求转发到另一台服务器
【发布时间】:2015-12-20 23:00:16
【问题描述】:

我正在尝试基于所谓的“微架构”构建一个 NodeJS REST API 项目(基本上是多个较小的 NodeJS 项目,它们可以完全独立运行,但同时可以协同工作)。

目前用户可以从应用程序上传图片,然后我的 NodeJS 后端会适当地处理和保存它们。

现在,我想做的是:

用户从应用程序中选择要上传的图像 -> 应用程序向“主 API”端点发出请求 -> 主 API 端点然后将此请求转发给“图像服务” -> 一旦图像服务(其中是一个完全不同的服务器)已成功完成,它应该将存储图像的 URL 返回到 Main API 服务器端点,然后它将信息返回给应用程序。

我的问题是,如何将图像上传请求从一台服务器转发到另一台服务器?理想情况下,我不希望 Main API 临时存储图像,然后向图像服务发出请求。

我想要尝试将 Main API 接收到的数据直接转发到图像服务服务器。我想你可以说我想将数据从一个地方“流式传输”到另一个地方,而不必临时存储在磁盘或内存上。我实际上只是希望它从一台服务器“隧道”到另一台服务器。

这可能吗?这是一种有效的方法吗?我只想让应用程序访问 1 个中心点,我不想让它知道这个图像服务服务器。我希望该应用只向 Main API 发出请求,然后它会根据需要调用我的其他小服务。

我正在使用 NodeJS、Express、Multer(用于图像上传)和 Digital Ocean 托管(如果这有什么不同的话)。

【问题讨论】:

    标签: node.js api file-upload image-uploading micro-architecture


    【解决方案1】:

    您基本上要做的是设置一个代理服务器,它将请求直接传递到另一台机器并返回。有一些库可以帮助解决这个问题,本文特别是 http://blog.vanamco.com/proxy-requests-in-node-js/ 将解释如何进行设置,即使他们实际上只是试图绕过 HTTPS,同样的概念也适用于此。

    简而言之,您获得文件上传 POST,然后立即向另一台服务器发出相同的请求,当返回响应时,立即将其返回给前端。您的入口点可以设置为集线器,您可以将请求代理到其他服务器,甚至在必要时在同一台服务器上处理它们。

    【讨论】:

    • 如果“Main API”需要做一些额外的逻辑(例如将“图像服务”返回的链接保存在数据库中针对当前用户),这是否也可以工作?
    • 在这种情况下是的,因为您能够捕获上传服务的返回响应。所以你的主要端点收到一个请求,接受这个请求并使用相同的请求数据向不同的服务器发出一个新请求,然后当你得到响应时,你可以在返回响应之前记录它或保存它或转换它原始请求。
    • 对不起这个愚蠢的问题,但如果我代理请求,我怎么还能捕捉到响应? ImageService完成初始操作后不会自动返回吗?
    • 它不必是一个完全透明的代理,你会拥有Client --- (POST {imageStuff:'...'}) ---> Main --- (POST {imageStuff:'...'}) ---> ImageUploader --- (Save file data to disk, respond {margin: 'success', fileData:{imageStuff:'...'}}) ---> Main --- (Save message / name / data to DB, respond {margin: 'success', fileData:{imageStuff:'...'}}) ---> Client 我希望这对于事物流来说是有意义的。
    • 我最终在这里使用此模块来代理请求:github.com/nodejitsu/node-http-proxy 感谢您的帮助 Scottux! :)
    猜你喜欢
    • 2012-06-07
    • 2012-04-23
    • 2012-12-27
    • 1970-01-01
    • 2022-12-10
    • 2023-03-16
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多