SyntaxError:意外的令牌<在JSON Aurelia

时间:2018-04-21 08:28:27

标签: javascript aurelia

我使用Aurelia构建了一个Web应用程序。我想显示一个从列表视图传递参数(id)的详细信息页面。这是我的(简化的,"详细信息"是基本数据类)控制器代码:

    [HttpGet("[action]")]
    public IActionResult GetDetail(int _id)
    {
        var b = new Detail()
        var customjson = JsonConvert.SerializeObject(b, Formatting.Indented);
        return Ok(customjson);
    }

详细信息是通过detail.ts类中的activate()方法获取的:

    constructor(http: HttpClient) {
    this.http = http;
}

activate(params: any) {
    this.http.fetch("api/Begroting/GetBegroting/" + params.id)
        .then(result => result.json as Promise<Begroting>)
        .then(data => {
            this.begroting = data;
            console.log(data);
        });
}

但是,当通过列表页面加载详细信息页面时,会出现此错误:

  

Uncaught(在promise中)SyntaxError:意外的标记&lt;在位置0的JSON中。通过Swagger测试API会产生有效的json和状态代码200。

暗示API(调用)存在问题。

2 个答案:

答案 0 :(得分:2)

OP已经解决了他的问题,但为未来的读者澄清了可能发生的事情:

SyntaxError: Unexpected token < in JSON是在您请求不存在的资源时通常会发生的错误。服务器返回标准的404 HTML错误响应。

当客户端尝试将HTML文档解析为JSON时,它将失败(它是失败的<标记的第一个<html>

客户端需要状态代码而不是错误页面

这里更深层次的问题是服务器应该真正返回404 状态代码响应,以便客户端知道请求失败,并且不会尝试处理它,就好像它一样成功了。毕竟,404错误html页面附带了200状态代码。

因此,除了在客户端(或服务器端的路由)上修复请求URL之外,还应配置服务器和/或客户端,以便返回正确的状态代码。我相信Accept: application/json会照顾这个,虽然我没有测试过。

OP的另一种解决方案:

RESTful服务背后的想法是你的URI代表资源;查询字符串很适合在列表上排序/过滤/分页参数等。 ID类型属于路径,而不是查询字符串。

将您的路线属性更改为:[HttpGet("[action]/{_id}")],您的初始客户端代码应该再次有效。

答案 1 :(得分:1)

我们调用了api / Begroting / GetBegroting / _id,而不是将id指定为GET参数。结果是对api的调用将我们重新路由回index.html。因此意外的令牌&lt;在JSON Aurelia错误。

要解决此问题,请将API调用更改为api / Begroting / GetBegroting /?_ id = + params.id