错误: 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);
}
})
答案 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
上的对象。