问题描述
由于要发送到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);