提问人:tester0001 提问时间:11/16/2023 更新时间:11/16/2023 访问量:24
除非应用 preventDefault,否则 JSReact API 响应不会保存到本地存储
JSReact API response won't save to local storage unless preventDefault is applied
问:
有一个需要登录和注册的应用。现在,所有 api 请求都正确返回正确的数据。尝试将返回的数据保存到 localstorage 时会出现问题。尝试登录时,返回数据(即:token)不会保存到 localstorage,除非在调用函数之前应用了 e.preventDefault()。现在,数据是从后端提取的,但在客户端,它不会保存到本地存储。提交登录表单后,localstorage 会刷新,不会保存任何内容。现在,如果应用了 prevent default,它将保持正确保留状态。有没有办法在没有e.preventDefault()的情况下保存本地存储令牌。signin
现在我知道它确实与 api 部分有关。 如果我将其更改为 .它在没有 e.preventDefault() 的情况下完美保存。.then((d)=>{...})
.then(localstorage.setItem("token", 1)
登录.js
import { signup, signin } from "../pages/api/index.js";
const [form, setForm] = useState({
email: "",
password: "",
});
const handleSumbit = (e) => {
//e.preventDefault(); //if this is applied localstorage token will stay
signin(form)
.then((d) => {
localStorage.setItem("token", JSON.stringify(d.data));
})
.catch((e) => {
console.log("error");
});
};
api.js
export const signin = async (data) => {
return await axios.post("http://localhost:5010/signin/", data);
};
后端签名.js
export const signin = async (req, res) => {
const data = req.body;
const email = data.email.trim().toLowerCase();
const username = data.username;
const user = await User.findOne({
$or: [{ email }, { username }],
});
if (!user) {
return res.status(404).json({ error: "Error / Cannot find User" });
}
const valid = await bcrypt.compare(data.password, user.password);
if (!valid) {
return res.status(404).json({ error: "Wrong/Error with Credentials" });
} else {
//create and return json web token
//res.send(jwt.sign({ id: user._id }, process.env.JWT_SECRET));
return jwt.sign({ id: user._id }, process.env.JWT_SECRET);
}
};
答:
0赞
Akeel Ahmed Qureshi
11/16/2023
#1
为了避免使用'e.preventDefault()',您可以考虑使用onSubmit属性而不是onClick来处理表单提交。通过这样做,您可以阻止默认表单提交,而无需显式调用 e.preventDefault()。此方法可能有助于避免使用 e.preventDefault()
const handleSumbit = async () => {
try {
const response = await signin(form);
localStorage.setItem("token", JSON.stringify(response.data));
} catch (error) {
console.log("error", error);
}
};
<form onSubmit={handleSumbit}>
<button type="submit">Submit</button>
</form>
评论
0赞
tester0001
11/17/2023
所以是的,我更新为使用 onSubmit 而不是 onclick。并重新设计了我的句柄提交。同样的错误仍然存在。厌倦了查找其他示例,但找不到问题所在。肯定是在客户端,因为提供了来自后端的数据。另请注意:使用 onsubmit 更改 e.preventDefault 现在不起作用。
评论