【问题标题】:Angular project error in production mode: SyntaxError: Unexpected token { in JSON at position 65生产模式下的 Angular 项目错误:SyntaxError: Unexpected token { in JSON at position 65
【发布时间】:2021-06-22 23:20:37
【问题描述】:

我需要这方面的帮助。可能这是愚蠢的,但经过数小时的调查,我看不出问题所在。 我有一个 Angular 10 项目。这是后端(php中的api):

...
$result = array(
        'status' => 'success',
        'code'   => 200,
        'data'   => $productos
    );

    echo json_encode($result);
});

它返回这个 json:

{
    "status":"success",
    "code":200,
    "data":
    [
        {
            "id":"1",
            "nombre":"Gazpacho tradicional",
            "marca":"Hacendado",
            "puntuacionYuca":"90\/100",
            "puntuacionCoco":"9\/10",
            "puntuacionMyReal":"Buen procesado",
            "mediaVagana":"9",
            "imagen":"gazpacho-hacendado.jpg",
            "supermercado":"Mercadona",
            "comentario":"Saludable en otras marcas"
        }
    ]
}

我在几个网站上检查了json,它是有效的。

这是 angular service.ts 中的代码:

getProductosVaganos(){
        return this._http.get(this.urlvaganos+'productos-vaganos').pipe(map((response: any) => response.json()));
    }

这是angular component.ts中的代码:

getProductosVaganos(){
        this._productoVaganoService.getProductosVaganos().subscribe(
            result => {
                if (result.code != 200){
                    console.log(result);
                }else{
                    this.productosVaganos = result.data;
                }
            },
            error => {
                console.log(<any>error);
            }
        );
    }

它在本地开发模式下完美运行。但是当我编译项目并将其部署到主机的 public_html 文件夹时,它会在 component.ts 函数中返回此错误:

list.component.ts > getProductosVaganos() > error:  SyntaxError: Unexpected token { in JSON at position 65
    at JSON.parse (<anonymous>)
    at gd.json (main.99255eee2d008be2c609.js:1)
    at O.project (main.99255eee2d008be2c609.js:1)
    at O._next (main.99255eee2d008be2c609.js:1)
    at O.next (main.99255eee2d008be2c609.js:1)
    at XMLHttpRequest.s (main.99255eee2d008be2c609.js:1)
    at l.invokeTask (polyfills.35a5ca1855eb057f016a.js:1)
    at Object.onInvokeTask (main.99255eee2d008be2c609.js:1)
    at l.invokeTask (polyfills.35a5ca1855eb057f016a.js:1)
    at a.runTask (polyfills.35a5ca1855eb057f016a.js:1)

public_html文件夹的结构与本地相同。

我已经测试了 JSON.stringify() 和 JSON.parse() 方法,但没有找到解决方案。 我也测试过在 service.ts 的方法中删除行尾的 .json()。在这种情况下,当我在 chrome 中调试时,在生产中,它进入 component.ts 方法的“result”内部,但 result.data 元素是“undefined”。

我认为问题出在本地和生产之间,因为它们有不同的语言,本地的打字稿和生产中的编译版本,即 javascript,但我不知道如何解决它。

任何帮助将不胜感激。

问候。

【问题讨论】:

  • pipe(map((response: any) =&gt; response.json())) 更改为pipe(tap(response =&gt;console.log(response)),map((response: any) =&gt; response.json())) 时在控制台中看到什么
  • 抱歉耽搁了,我在上班时间之前写的,现在已经写完了。我把这个新参数放到管道方法中:return this._http.get(this.urlvaganos+'productos-vaganos').pipe(tap(response =&gt;console.log("tap: ", response)),map((response: any) =&gt; response.json())); 奇怪的是,控制台没有显示这个console.log。它显示错误:ERROR TypeError: Object(...) is not a function at e.getProductosVaganos (main.043912fd7b9d49cb76b0.js:1) at e.getProductosVaganos (main.043912fd7b9d49cb76b0.js:1) at e.ngOnInit (main.043912fd7b9d49cb76b0.js:1) ...
  • 我输入任何类型来点击响应并返回:gd {_body: "{↵ "success": false,↵ "error-codes": [↵ "inva…dona","comentario":"Saludable en otras marcas"}]}", status: 200, ok: true, statusText: "OK", headers: sd, …} headers: sd {_headers: Map(13), _normalizedNames: Map(13)} ok: true status: 200 statusText: "OK" type: 2 url: "http://vaganos.es/...

标签: javascript json angular typescript production


【解决方案1】:

我发现了错误。我在 API 中有一些 Google Recaptcha 代码,在同一个文件中包含连接到数据库的代码。此 google Recaptcha 代码失败,并以 JSON 格式抛出错误。这段 JSON 位于响应的开头,因此解析器无法正确读取响应数据的部分。 评论这个 Recaptcha 代码,网络运行正常。 问候。

【讨论】:

    【解决方案2】:

    看来response 已经完全回复了。尝试如下明确写{observe: 'body'}

    getProductosVaganos(){
        return this._http.get(this.urlvaganos+'productos-vaganos', {observe: 'body'}).pipe(map((response: any) => response.json()));
    }
    

    【讨论】:

    • 感谢您的回答,但此解决方案无法编译。我宣布“观察”,但这不是理由。另外,我尝试了一个可观察的对象,但错误仍然存​​在。它说“观察类型的参数:字符串不能分配给'RequestOptionArgs'类型的参数”。我遇到的错误摘要是:如果我在服务上转换响应(使用.json()),它在本地工作,但在生产中出现“意外的令牌......”。如果我删除此转换,它在本地不起作用,并且在生产中进入组件方法的“结果”段落但 result.data 未定义。
    • 您使用的是哪个角度版本?我猜您使用的是旧版本(4 或更早版本)。
    • 这是 ng version 命令的结果:imgur.com/a/H5L5Yz3
    • 我想我必须了解更多关于 http vs httpclient 和 rxjs 的知识。谢谢 N.F.给我一些线索。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2016-11-03
    • 2019-11-17
    • 2019-09-20
    • 2020-10-23
    • 1970-01-01
    • 2021-04-27
    • 2021-09-30
    相关资源
    最近更新 更多