簡體   English   中英

如何使用 GraphQL 將二進制數據發送回客戶端

[英]How to send binary data back to client using GraphQL

我有一個 GraphQL 服務器,托管在 express 上。 我想通過發回 nodejs 緩沖區對象將圖像返回給客戶端。 我如何配置 graphql 服務器以返回字節而不是 json? 我不希望通過 base64 執行此操作,因為圖像尺寸很大。

您必須返回 JSON,但仍有辦法。 我們使用 GraphQL 返回存儲在舊版 sql 數據庫中的 Blob 字段中的圖像。 我們正在使用 sequelize、graphql-sequelize 和 graphql-js。 我們已經在我們的 graphql 模式中將 Blob 字段定義為字符串類型,因此它們可以很好地通過 json 回復。 然后我們在交付之前轉換為緩沖區,例如

const imgBuffer = new Buffer.from(imgObj.data, 'ascii');

唯一的問題是我們現在無法通過 graphql 接口將圖像數據保存回數據庫。 我們的變異函數在字符串中發現某些錯誤的 unicode 字符時會給我們一個語法錯誤,比如 \\U0000 等等(所以我發現你的問題正在尋找解決方案)。

有一種方法,但是很復雜,而且很手動,我只會給你概述一下我在 ApolloServer 中所做的事情,但我認為應該足夠了。

首先,您需要在請求中使用“Accept”標頭發送二進制 mime 類型,並在響應中發送匹配的“Content-Type”。 正如您將看到的(使用 EJSON),這是高效的必要條件,但不是工作的必要條件。

要根據標頭進行序列化和反序列化,您可能需要編寫一個快速中間件,並且您需要使用 {$data: "..."} 封裝對象處理 base64 編碼(如 EJSON 那樣)或只是(奇怪地)返回null,如果有人使用“application/json”作為他們的“accept”標頭來請求二進制數據。 您還需要選擇您將支持的二進制格式。 我只使用 1:“application/x-msgpack”,但我聽說“application/cbor”越來越流行。 您可以使用 EJSON、MessagePack 和 CBOR 庫來進行序列化,因此這並不像聽起來那么難。

然后我強烈建議在任何圖像上使用@defer。 有關@defer 的更多信息,請參閱此帖子: https ://www.apollographql.com/blog/introducing-defer-in-apollo-server-f6797c4e9d6e/

我已經做到了。 這並不容易,如果 ApolloServer 以這種“開箱即用”的方式工作會更好。

最好發送一個散列和臨時鏈接來下載它

  • 可以對 URL 進行哈希處理,使其無法被其他用戶訪問。
  • 后端可以使鏈接過期或刪除靜態服務器上的二進制文件。

使用此處找到的節點模塊可能會回答您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM