首页 > 解决方案 > fetch Prototype.json() 损坏/更改正文数据

问题描述

我已经敲了一个星期的头。这是不可能的,但它发生了(javascript,我知道):

我正在使用 fetch 从服务器获取数据,如下所示:

fetch(this.props.url, {
            method: 'POST',
            body: JSON.stringify({
                class: 'property',
                action: 'view', 
                objectId: this.props.element.id,
                token: this.props.token,
            }),
        })
            .then(response => response.json())
            .then(json => {
                console.log(json);})

现在,使用 Postman 进行测试可以得到正确的结果:

"units": [
            {
                "amount_due": 22.0,
                "id": 31,
                "floor": 5,
                "common_percentage": 0.012223,
                "building": {} 
            },
            {
                "amount_due": 16.0,
                "id": 33,
                "floor": 5,
                "common_percentage": 0.012143223,
                "building": {} 
            }
         ]

但是,控制台会记录 id 为 33 的两个单元。

检查后端 100 次,它返回正确的数据。邮递员证实了这一点。还尝试使用 .text() 而不是 .json() 解析响应,并且 .text() 返回正确的数据。这种损坏仅发生在 .json() 中。我是疯了还是发现了 .json() 方法的错误(或特殊性)?

谢谢。

编辑1:

感谢@ChrisG,我发现我的代码以某种方式破坏了数据。这一切都发生在 this.setState 被调用之后:

let completedProjects = json.property.projects.filter((project) => project.finish_date);
                    let completedJobs = json.property.jobs.filter((job) => job.complete.filter((completion) => completion.id == this.props.user.id).length > 0 && !job.on_hold && !job.deleted);
                    let timeline = [{title: <Trans>heading.property.added</Trans>, createdAt: <Moment locale={this.props.i18n.language} format="ll">{json.date_created}</Moment>, comment: <Trans>description.property.added</Trans>, icon: <FontAwesomeIcon icon="home" />, sortCriterion: this.props.element.date_created }];
                    let inspections = this.state.inspections; 
                    json.inspections.map((inspection)=>{
                        inspections.push({description: inspection.type.description, date: <Moment format="ll">{inspection.instance.date_performed}</Moment>, name: inspection.type.name, interval: inspection.type.interval, typeId: inspection.type.id, });
                    });
                    completedProjects.map((project) => {
                        timeline.push({title: <Trans>heading.project.completed</Trans>, createdAt: <Moment format="ll">{project.finish_date}</Moment>, comment: project.name, icon: <FontAwesomeIcon icon="project-diagram" />, sortCriterion: project.finish_date, iconColor: '#007bff' });
                    });
                    completedJobs.map((job) => {
                        timeline.push({title: <Trans>heading.job.finished</Trans>, createdAt: <Moment format="ll">{job.finish_date}</Moment>, comment: job.name, icon: <FontAwesomeIcon icon="check" />, sortCriterion: job.finish_date, iconColor: '#007bff' });
                    });
                    timeline.sort((a, b) => a.sortCriterion < b.sortCriterion);
                    this.setState({
                        element: json.property,
                        activeJobs: json.property.jobs.filter((job) => job.complete.filter((completion) => completion.id == this.props.user.id).length == 0 && !job.on_hold && !job.deleted),
                        completedJobs: completedJobs,
                        remainingJobs: json.property.jobs.filter((job) => job.on_hold || job.deleted),
                        // activeProjects: json.property.projects.filter((project) => !project.finish_date),
                        activeProjects: json.property.projects,
                        completedProjects: completedProjects,
                        collapse: true,
                        timeline: timeline,
                    });

一个澄清:“单位”部分(被破坏的部分)是“属性”对象的属性。现在我正在写这篇文章,“property”是否可能是某种保留字,它会弄乱事情?

编辑2:

将问题归结为:

this.setState({element: json.property})

有任何想法吗?

标签: javascriptjsonfetch

解决方案


好的,原来问题出在 this.setState() 函数中,因为它以某种方式破坏了数据。因此,按预期获取 response.proptotype.json() 函数。我正在打开一个新问题来跟踪真正的问题。感谢@ChrisG 的指示。


推荐阅读