SyntaxError: Unexpected token R in JSON at position 0

2024-04-12 21:32

本文主要是介绍SyntaxError: Unexpected token R in JSON at position 0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

这是在写多人博客管理系统练习项目时遇到的一个坑(巨坑)。因为学习视频中老师没有提到,所以得自己解决。但是又因为个人的错误又有一定的特性,导致某些方面没有想到而花费了大量的时间。在此记录一下,防止以后再犯同样的错误,也方便别人能解决错误。如果你百度查到 SyntaxError: Unexpected token R in JSON at position 0 报错并按照里面的方法还是无法解决不妨将这篇笔记看完。

报错信息1

在这里插入图片描述

报错代码

// 联合查询两个集合信息(文章和用户,但是这里只展示了部分字段)
let articles = await Article.find({}, { cover: 1, _id: 1, title: 1, publishDate: 1 }).populate('author', { userName: 1, _id: 0 });
// res.send(articles);
// 渲染页面
res.render('admin/article', {articles: articles,count: count
});

报错原因

根据报错信息可以知道是在字符串数据格式向 json 数据格式转换时发生了错误。那为什么会这样呢?从数据获取得到的不是一个个对象组成的数据集合吗?在用户管理页面(前面实现的一个功能没有报错)输出单纯查询到的用户信息的格式如下(注意:没有涉及联合查询,只截取部分):

在这里插入图片描述

文章管理页面使用集合关联查询得到的数据中结构唯一不同的内容如下图,那问题是不是就应该出现在下面标记的那部分呢?

在这里插入图片描述

参考他人的笔记,原因是 mongoose 返回的 author 对象不是普通对象,而是所谓的 mongoose 文档对象。里面的属性存在与普通对象不一样的格式,所以在解析时出现错误

解决方法

方法一:结合原因我们需要将 author 属性转换为普通对象,有一种方式是在查询数据时链式调用 lean() 方法这会使 mongoose 返回普通对象而不再是 mongoose 文档对象

方法二:可以先使用 JSON.string() 方法将返回的集合整体转换为 json 字符串后再使用 JSON.parse() 方法将其解析为 json 对象。代码示例如下:

    let articles = await Article.find({}, { cover: 1, _id: 1, title: 1, publishDate: 1 }).populate('author', { userName: 1, _id: 0 });let articles1 = JSON.stringify(articles);let articles2 = JSON.parse(articles1);// console.log(articles == articles2); // false// res.send(articles);res.render('admin/article', {articles: articles2,count: count});

将 articles 转换为字符串后再次将其转换为 json 对象即可解决问题,如果输出 articles 和 articles2 看不出两者有什么不同(为了方便对比特意关闭了浏览器插件)。如图两者一样的输出,但是如果使用 == 比较两者返回的是 false

在这里插入图片描述

你还没有解决吗?

如果你还没有解决那可能是跟我一样问题了。我是在测试用户的删除功能时将添加该文章的用户删除了,而其相应的文章也该从数据库中删除。但是我没有将相应的文章删除,这会导致在查询文章信息时用户 author 字段是 null 值。这样即使使用上述方法也会出现另一个错误 SyntaxError: Unexpected token T in JSON at position 0
在这里插入图片描述

在这里插入图片描述

其实是一样的原理,因为在解析本该遇到普通对象的值时遇到的却是 null 。但又不是跟前面那样是文档对象,所以格式上不同错误信息提示解析遇到的不合法内容也就不同。

当然还有一种可能就是你渲染的模板出现了问题,例如在模板中导入骨架模板文件时写错单词(我就有一次将 extend 写成 extends),或者其他模板填充标签出错等。

这篇关于SyntaxError: Unexpected token R in JSON at position 0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898290

相关文章

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR