在 Nest.js 中,如何在我的 API 响应中提供与我的 JSON 对象捆绑在一起的静态内容文件

Posted

技术标签:

【中文标题】在 Nest.js 中,如何在我的 API 响应中提供与我的 JSON 对象捆绑在一起的静态内容文件【英文标题】:In Nest.js, how to serve static content file/s bundled together with my JSON object in my API Response 【发布时间】:2019-08-07 23:37:42 【问题描述】:

在我的 Nest.js API 中,我有一个 GET 必须返回一个 db 行,一起在响应中包含(最多)6 个图像文件(base64 编码)。

可以做的是:

db 中的 6 列包含唯一文件名(实际图像位于名为“image-uploads”的文件夹中),连同路径我可以使用@Res 装饰器发送任何 one 他们回来了,例如

@Get('/findVehicleEntry/:id')
async findVehicleEntry(@Param('id') id: number, @Res() res) 
    const resVehicle: Vehicle = await this.vehiclesService.findVehicleEntry(id);
    if (resVehicle) 
        res.sendFile(resVehicle.photo1,  root: 'image-uploads' );
    

以上成功下载了一个图片文件为 Content-Type: "application/octet-stream"

我的计划是(我不知道该怎么做):

首先,从文件夹中获取图像并放入变量,然后对其运行base64编码,然后将resVehicle.photo1设置为等于该base64字符串,对其他5个执行相同操作图片,然后做一个 res.send(resVehicle);

类似这样的:

@Get('/findVehicleEntry/:id')
    async findVehicleEntry(@Param('id') id: number, @Res() res) 
    const resVehicle: Vehicle = await this.vehiclesService.findVehicleEntry(id);
    if (resVehicle) 
        let image = something.get('resVehicle.photo1', 'my/path/to/image-uploads');
        image = Buffer.from(image).toString('base64');
        resVehicle.photo1 = image;
        // do the same for the other 5 images
        res.send(resVehicle);
    

这是我第一次使用 Nest/Express/Node,实际上这是我编写的第一个 API,所以我的想法/设计可能完全偏离了。欢迎任何建议。非常感谢。

编辑:一直在阅读大文件的 base64 编码不是一个好主意。我很高兴放弃 base64 的想法,主要问题是如何将我的数据库行 JSON 对象和 6 个图像放入同一个响应中?

【问题讨论】:

【参考方案1】:

你说得对,图片的 base64 编码不是一个好主意。

这里的传统解决方案是: 您不推送图片,您在 json 响应中提供图片路径,并让 API 使用者使用该路径来获取图片。

将实际图像文件保存在公开可用的文件夹中,而不是数据库中。这意味着它应该可以从浏览器访问,例如yourdomain.com/images/image232.jpg 在您的数据库中,将这些图像的路径存储为字符串 (image1: "yourdomain.com/images/image232.jpg") 提供包含路径 (make:"Toyota", image1:"yourdomain.com/images/image232.jpg") 的 json 响应 使用您的 API 的任何人都可以使用该路径来获取图像。

【讨论】:

感谢您的信息。 Ja,这(几乎)正是我所做的。我以 JSON 格式发回文件名,并公开了另一个可用于获取图像文件的端点。额外的好处是前端首先获取所有数据,并在后台调用图像时构建页面。它运作良好。再次感谢您的回复。 附言。试图赞成你的答案,但我不能,没有足够的代表。 如果您认为这是您问题的正确答案,您可以将其标记为答案,而不是投票。

以上是关于在 Nest.js 中,如何在我的 API 响应中提供与我的 JSON 对象捆绑在一起的静态内容文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元测试 Nest.js 中测试抛出新的 HttpException

在 Nest JS 中发出 http 请求时出现 httpService 未定义错误

Nest JS - 客户端验证失败:需要路径

在 Nest.js 项目中添加 Swagger 基本路径字段

Nest.js 用了 Express 但也没完全用

Nest.js 模型依赖注入与 Mongoose 没有构造函数