ReactJS 和 Node.JS [JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符]

Posted

技术标签:

【中文标题】ReactJS 和 Node.JS [JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符]【英文标题】:ReactJS and Node.JS [JSON.parse: unexpected character at line 1 column 1 of the JSON data] 【发布时间】:2020-01-11 18:58:40 【问题描述】:

我对这段代码感到困惑,所以我需要第三眼来寻找解决方案。

我正在使用带有 Node.JS (Express) 的 REST API 开发一个 ReactJS 应用程序,但我收到了这个错误:

SyntaxError:“JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符”

我正在使用Sequelize ORM 在 Node.JS 中处理模型和数据库。 我也在为 Node.JS 使用 CORS 模块。

这个实现工作正常。

// Node.js Route for login
const router = require('express').Router();
const User = require('user');
router.post("/login", async (req, res) => 
    try 
        await User.findOne(
            where: 
                email: req.body.email,
                password: req.body.password,
            
        ).then((user) => 
            if (!user) 
                return res.send(message: "Login error!");
             else 
                const userData = id: user.id, email: user.email;
                res.send("user": userData);
            
        ).catch((err) => 
            return res.send(err);
        );
     catch (err) 
        return res.send(err);
    
);
// ReactJS for login
loginFunction(e, data) 
    e.preventDefault();
    fetch('http://localhost:4500/login', 
        method: 'POST',
        headers: 
            'Content-Type': 'application/json'
        ,
        body: JSON.stringify(data)
    )
        .then(response => response.json())
        .then(json => 
            this.setState('user': json['user']);
        )
        .catch((err) => 
            console.log(err);
            this.setState(errors: "Login error")
        );

另一方面,这个实现不能正常工作并抛出上面的SyntaxError

// Node.JS for Posts
const router = require('express').Router();
const Post = require('post');
router.get("/posts", async (req, res) => 
    try 
        await Post.findAndCountAll()
            .then((posts) => 
                res.send("posts": posts);
            ).catch((err) => 
                return res.send(err);
            );
     catch (err) 
        return res.send(err);
    
);
// ReactJS for Posts
postsFunction() 
        fetch('http://localhost:4500/posts', 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json'
            
        )
            .then(response => response.json())
            .then(json => 
                this.setState('posts': json.posts.rows);
            )
            .catch((err) => 
                console.log(err);
                this.setState(errors: "Posts error.")
            );
    

如您所见,这两种实现方式差别不大,我缺少什么?

PS:当我在 Postman 上测试第二个实现时,数据检索成功。

【问题讨论】:

将刚刚解析为json的数据进行字符串化的原因是什么? this.setState(posts: JSON.stringify(json.posts.rows)) 当我从另一个路由器示例复制时,它只是保留在那里。已在代码示例中修复。修改它并不代表积极的结果。 【参考方案1】:

在使用 GET 方法时尝试删除标题

headers: 
       'Content-Type': 'application/json'

【讨论】:

您可以尝试控制台日志response 而不是response => response.json(),可能响应可能是您的try catch 代码错误,而不是json 数据 @YulioAlemanJimenez,或者您可以尝试使用axios 而不是fetch 当将response.json() 替换为response 我得到这个对象:Response: ​ body: ReadableStream ​​ locked: false ​​ <prototype>: object … ​ bodyUsed: false ​ headers: Headers ​ ok: true ​ redirected: false ​ status: 200 ​ statusText: "OK" ​ type: "basic" ​ url: "http://localhost:3000/admin/undefined/posts" ​ 注意URL,为什么它是连接React URL + undefined + Node.JS 路由路径?? 我也没有,来自fetch lib【参考方案2】:

尝试在导致错误的节点js函数中使用res.json而不是res.send。

【讨论】:

尝试在节点成功查询函数内添加控制台。【参考方案3】:

我发现了问题!

我遵循 (@vengleab so) 的建议:

控制台日志response 而不是response => response.json()

我意识到response 返回一个像这样的对象:

Response: 
    body: ReadableStream
    locked: false
    <prototype>: object  … 
    bodyUsed: false
    headers: Headers  
    ok: true
    redirected: false
    status: 200
    statusText: "OK"
    type: "basic"
    url: "http://localhost:3000/admin/undefined/posts"

URL 属性包含一个undefined 值,因此当我尝试控制台记录.env 变量API_URL 时,该变量包含此行中使用的本地主机URL:

fetch('http://localhost:4500/posts', 

真正的功能是:

fetch(process.env.API_URL + '/posts', 

console.log 的结果是undefined

正如Create React App 文档中所述,环境变量必须以前缀REACT_APP_ 开头。

最后一行是:

fetch(process.env.REACT_APP_API_URL + '/posts', 

【讨论】:

以上是关于ReactJS 和 Node.JS [JSON.parse:JSON 数据的第 1 行第 1 列出现意外字符]的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 与 reactjs -node.js 集成 - 实施指南

如何以 Node JS 作为后端将 Mysql 数据获取并显示到 ReactJS 前端?

ReactJS 学习路线

如何使用node js,reactjs,express从实际网页中的mongodb中获取数据

Reactjs Stripe 支付不适用于 Node/Express

React.js 与 Node.js Rest API