如何使用GraphQL

时间:2017-04-18 13:19:53

标签: javascript node.js graphql

我有一个GraphQL服务器,托管在express上。我想通过发回nodejs缓冲区对象将图像返回给客户端。如何配置graphql server,返回字节,而不是json?我不希望通过base64这样做,因为图像很大。

3 个答案:

答案 0 :(得分:1)

你必须返回JSON,但还有一种方法。我们使用GraphQL返回存储在旧版SQL数据库中的Blob字段中的图像。我们正在使用sequelize,graphql-sequelize和graphql-js。 我们已经在我们的graphql架构中将Blob字段定义为String类型,因此它们在json应答中很好地通过了。 然后我们在交付前转换为缓冲区,如

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

唯一的问题是我们现在无法通过graphql界面将图像数据保存回数据库。我们的变异函数在字符串中找到某些坏的unicode字符时会给我们一个语法错误,例如\ U0000和诸如此类的东西(所以我发现你的问题正在寻找解决方案)。

答案 1 :(得分:0)

使用找到的here节点模块,可能会回答您的问题。

答案 2 :(得分:0)

有一种方法,但是它很复杂,而且非常手动,我仅向您简要介绍我在ApolloServer中所做的事情,但我认为应该足够了。

首先,您需要在请求中使用“ Accept”标头发送二进制mime类型,并在响应中发送匹配的“ Content-Type”。正如您将看到的那样(使用EJSON),这对于提高效率是很必要的,但对于工作却不是必需的。

要遵循标题进行序列化和反序列化,您可能需要编写一个快速的中间件,并且您需要使用{$ data:“ ...”}封装对象(如EJSON那样)或仅仅(奇怪的是),如果有人使用“ application / json”作为其“ accept”标头来请求二进制数据,则返回null。您还需要选择要支持的二进制格式。我只使用1:“ application / x-msgpack”,但是我听说“ application / cbor”正变得越来越流行。您可以使用EJSON,MessagePack和CBOR的库来进行序列化,因此听起来并不那么困难。

然后,我强烈建议在任何图像上使用@defer。有关@defer的更多信息,请参见这篇文章:https://www.apollographql.com/blog/introducing-defer-in-apollo-server-f6797c4e9d6e/

我已经做到了。这并不容易,如果ApolloServer可以“开箱即用”地工作,那会更好。