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

相关文章

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: