【问题标题】:NestJS : return a stringNestJS:返回一个字符串
【发布时间】: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 后,它仍然不起作用,标头被删除。

标签: angular typescript nestjs


【解决方案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 你能回答我这个问题吗! stackoverflow.com/questions/57266622/…
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2019-10-29
  • 2012-03-30
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多