如何解决未处理的承诺拒绝?

时间:2021-07-19 10:47:00

标签: json reactjs express restapi

错误: UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
我正在制作一个 MERN 堆栈应用程序,在 前端 我有注册表单,下面给出了它的 POST 方法。

const onSignUp = async (e) => {            
        e.preventDefault();
        try {
            const body = {
                username,  
                email, 
                password, 
                firstname, 
                lastname, 
                country_code, 
                phone_no,  
                address, 
                city, 
                state, 
                country
            };
            console.log(typeof(JSON.stringify(body)));                        
            const response = await fetch("http://localhost:5000/api/user/create",{
                method : "POST",
                headers: {"Content-Type" : "application/json"},
                body: JSON.stringify(body)
            });            
            console.log(response);
        }
        catch (err) {
            console.error(err.message);
        }
    }

在主 index.js 文件中考虑 api/user 并且此路由是在 user.js 文件中创建的。
后端我有/create路线如下:-

router.post('/create', async (req, res) => {
    const body = JSON.parse(req.body)
    console.log('backend'+typeof(req.body));
    try{        
        const {username, email, password, firstname, lastname, country_code, phone_no,  address, city, state, country} = req.body;
        const salt = await bcrypt.genSalt(10);
        const hashed_password = await bcrypt.hash(password, salt);
        const newUser = await pool.query(
            "INSERT INTO User_ (username, email, password, firstname, lastname, country_code, phone_no,  address, city, state, country) VALUES ($1, $2, $3, $4,$5, $6, $7, $8, $9, $10, $11) RETURNING user_id, username"
            [username, email, hashed_password, firstname, lastname, country_code, phone_no,  address, city, state, country]
        );
        res.status(201).send(newUser.rows[0]);
    }
    catch(err){
        console.log("Error : ", err);
    }
})

1 个答案:

答案 0 :(得分:2)

我认为这有两层。

首先,async 函数总是返回 promise。如果在 async 函数中抛出错误,它会拒绝函数返回的承诺。在您的路由处理程序中,您有

const body = JSON.parse(req.body)

async 函数的顶层。这意味着在解析 JSON 时抛出的任何错误都将是未处理的拒绝。

您可能希望将该行移入 try/catch 以便对其进行处理,因为 Express 不会对您返回的承诺执行任何操作。 但是,请看下一项。

其次,您的错误消息是当您对已经被解析的对象调用 JSON.parse 时得到的经典错误,因为 JSON.parse 将其参数转换为字符串,而您为普通对象获得的字符串是 "[object Object]" — 请注意位置 1(从 0 开始)处的 o

我怀疑您安装了已经为您解析 JSON 的中间件,因此您根本不想执行该 JSON.parse 调用。只需使用 req.body 上的对象。