使用Devise登录时遇到问题-JSON.stringify转义字符

问题描述

由于要发送到users/sign_in路由的凭据格式,我在使用Devise签名用户时遇到了麻烦。这是我发送请求的客户端代码:

  async function handleSubmit() {
    const bodyFormData = new FormData();
    bodyFormData.append('user',JSON.stringify(credentials));

    try {
      const res = await axios({
        method: 'post',url: url,data: bodyFormData,headers: { 'Content-Type': 'multipart/form-data' }
      });
      console.log('Status: ',res.status);
      setSignedIn(true);
    } catch (err) {
      console.log(err.toJSON());
    }
  }

这是服务器的响应:

Started POST "/users/sign_in" for ::1 at 2020-08-22 18:12:55 -0700
Processing by Devise::SessionsController#create as HTML
  Parameters: {"{\"email\":\"fake@email.com\",\"password\":\"password\"}"=>"[FILTERED]"}
Completed 401 Unauthorized in 0ms (ActiveRecord: 0.0ms | Allocations: 170)

如您所见,JSON.stringify不必要地转义了字符。当我向邮递员发送请求时,它可以正常工作:

Started POST "/users/sign_in" for ::1 at 2020-08-22 17:44:37 -0700
Processing by Devise::SessionsController#create as */*
  Parameters: {"user"=>{"email"=>"fake@email.com","password"=>"[FILTERED]"}}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email","fake@email.com"],["LIMIT",1]]
Completed 200 OK in 269ms (Views: 0.3ms | ActiveRecord: 0.7ms | Allocations: 4545)

解决方法

如果您要通过这种方式发送数据,则将内容类型设置为json

const res = await axios({
  method: 'post',url: url,data: credentials,headers: { 'Content-Type': 'application/json' }
});

或者只是正常地不使用JSON.stringify附加表单数据,但我想您会遇到类似这样的事情:

bodyFormData.append('user[username]',credentials.username);
bodyFormData.append('user[password]',credentials.password);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...