NestJS:返回一个字符串

Posted

技术标签:

【中文标题】NestJS:返回一个字符串【英文标题】:NestJS : return a string 【发布时间】:2019-12-06 23:39:32 【问题描述】:

我正在使用@nrwl/Nx 创建一个项目。

我成功地向其中添加了 Angular 和 Nest 项目。

然后我尝试测试两者之间的连接。

角度代码

content;

testEndpoint() 
  this.http.get<any>('api/test').subscribe(res => this.content = res);

嵌套代码

@Controller()
export class AppController 
  constructor(private readonly appService: AppService) 

  @Get('test')
  testConnection(): string 
    return 'Some content';
  

正如所见,我只是想从端点返回一个字符串。在the documentation,

使用此内置方法,当请求处理程序返回一个 javascript 对象或数组时,它会自动序列化为 JSON。然而,当它返回一个字符串时,Nest 将只发送一个字符串而不尝试对其进行序列化。这使得响应处理变得简单:只需返回值,其余的由 Nest 处理。

所以很自然,我希望这会起作用(他们的示例与此基本相同)。

但是我遇到了以下错误:

错误:SyntaxError:JSON 中位于 [...] 位置 0 的意外标记 S

即使 HTTP 代码是 200 并且可以在网络选项卡中看到内容。

有人可以向我解释这是什么问题吗?

(我尝试在请求中添加内容类型标头,但没有成功)

EDIT 1:请求:

【问题讨论】:

你能检查一下响应的标题吗?如果客户端认为它是 JSON(显然不是;JSON 格式的字符串从 " 字符开始),客户端会忽略 mime 类型或服务器仍将其设置为 'application/json' (或类似的东西)。 尝试将其更改为http.get&lt;string&gt;,因为这是您所期望的。 @raina77ow 我已将完整请求作为图片上传到我的问题 @HereticMonkey 不工作 @raina77ow 内容类型标头具有误导性,但要让您知道,将 @Header('Content-Type', 'text/plain') 添加到 Nest 后,它仍然不起作用,标头被删除。 【参考方案1】:

看起来 HttpClient 只是忽略了服务器发送的内容类型,试图始终将响应视为 JSON。这很奇怪,但幸运的是,您可以覆盖它,明确指定预期的 responseType,如 the docs 中所述。

this.http.get('api/test', responseType: 'text')

需要注意的是,由于this issue,您必须删除泛型部分(或以其他方式删除类型)。

responseType 指定为'json' 以外的其他值时,不得使用泛型,因为随后将自动推断typeof T

【讨论】:

这会产生apps/client/src/app/app.component.ts(16,38): error TS2322: Type '"text"' is not assignable to type '"json"'. 从 IntelliSense 中,唯一允许的值是 arraybuffer as any 覆盖确实成功了! 2分钟标记为已解决,感谢您的帮助! 啊,是的。 :( the issue 描述了同样的问题,但不知何故仍然存在。是的,他们提到了类似的解决方法。 @raina77ow 你能回答我这个问题吗! ***.com/questions/57266622/…

以上是关于NestJS:返回一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

@Get 控制器和布尔查询中的 NestJS 验证失败(需要数字字符串)

NestJs Swagger 混合类型

.env 文件中的变量的 nestjs 问题

如何在@nestjs/mongoose 模式中设置枚举

大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送

无法在关系 nestjs/mongoose 上查询条件