所以当我开始这个项目时,有一个关于我如何接受图像的问题。在项目描述中,选择之一是将它们作为 base64 字符串接受。这引起了我的兴趣,因为我以前从另一份工作中听说过这种技术,但我个人从未使用过它。所以我决定这将是我要采取的方法,并且会学到很多东西!
事实证明,这是最初交付项目的最大瓶颈。
对我来说主要的未知数是解码 base64 图像并能够使用它。我迅速抓取了一张随机图像并将其带到一个网站以将其编码为 base64。我回来的东西对我来说就像 gobbledygook 或者甚至是 Matrix 代码。充其量我在字符串的第一部分认出了“data:image/png…”,而其余部分也可能是日语。而且很长……非常,长得吓人……
老实说,我最初的研究使我陷入了困境。有关于上传 base64 图像的讨论,但它没有具体的工作。最初很令人沮丧,实际上几次促使我把这个项目搁置了。在此期间,我会向周围寻求帮助。主要是联系 Twitter 和一些我认识的可以帮助我的后端朋友。不幸的是,我并没有真正收到他们的回音,只是继续独自前行。
然后我遇到了这个例子(向 Pankaj Kumar 大喊):
https://jsonworld.com/demo/nodejs-sample-application
在上面的示例中,节点服务器获取 base64 图像并在将其写入磁盘之前进行解码。它使用拒绝检查字符串中的两个内容“data:”和“base64”来验证它是否是base64 字符串。然后它会保存后面的文本,您可以在解码中使用这些文本。我并不自豪地说出来,但我最初把整个事情都搞砸了。我不太了解 Buffers 以及如何使用它们,而且我绝对不知道如何使用它们来解码 base64 数据。虽然我试图理解代码最初的含义,但我花了很多时间没有取得任何进展,我只想继续这个项目,而不是花更多的时间不前进。不过,我确实对上面的示例进行了一些修改。
对我来说很重要的是,我拥有可以在想要解码 base64 图像时调用的实用函数,因此我花了一些时间来构建我的代码,以便轻松找到我需要的东西。最初是从编写一个名为 prepare base64 img 的文件开始的,该文件将获取原始 base64 字符串并传递它,以及这些实用函数在返回最终结果之前将返回的任何内容。一种实用程序将从字符串中提取必要的部分并将它们放入正则表达式数组并返回它们。另一个实用程序实际上会进行解码和写入磁盘。我确保将正则表达式保存在自己的文件中,以便在需要时易于查找和更改(老实说,自从使用它以来我没有更改它)。
这种方法的最大问题之一是将文件写入磁盘。在从事其他后端项目时,这对我来说非常熟悉,因此我很快就习惯了这种方法。问题出现在 Node.js 非阻塞 I/O 以及您正在从磁盘写入和读取的事实与其他方法相比非常慢。在使用文件系统时,由于 JavaScript 的异步特性,很容易尝试写入文件系统,然后稍后在您的应用程序中尝试使用该文件,却发现没有什么可使用的。这可以通过使用 fs 包中的 writefilesync 来解决,但正如我稍后了解到的那样,这不是最佳实践,因为您希望利用 JavaScript 能够在将文件写入磁盘时继续通过您的应用程序,而不是保持整个系统起来。不过当时我并没有想到,老实说,这并不重要,因为我正在取得进步,这才是最重要的。我击败了 base64 图像,当我受伤时,我并没有被阻止。我很高兴能够成功实现 base64 解码。
最初我在服务器的响应中返回了原始图像,当我要求对我的工作进行一些反馈时,我被告知最好将它作为 base64 字符串传递,因为这可能是用户所期望的。编码图像的挑战要小得多,而且在找到解决方案之前只需要进行几次 Google 搜索。它涉及将图像文件从磁盘读取为 base64 格式,然后添加 base64 字符串的其他必要部分,然后将其传递给控制器,然后发送该响应。
这是我完成初始 Base64 验证时的提交: https ://github.com/chadstewart/you-go-backend-project/commit/3d796eac0406d4fa63c9f54888df010331a7414c
在本系列的下一篇文章中,我将处理请求验证。