除非应用 preventDefault,否则 JSReact API 响应不会保存到本地存储

JSReact API response won't save to local storage unless preventDefault is applied

提问人:tester0001 提问时间:11/16/2023 更新时间:11/16/2023 访问量:24

问:

有一个需要登录和注册的应用。现在,所有 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);
  }
};

JavaScript reactjs node.js mongoose 本地存储

评论


答:

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 现在不起作用。