axios post if 条件下的请求没有响应数据 react.js
axios post request in if condition has no response data react.js
我想 api 发送 otp 但是当 default_2fa 是移动的或 email.write 这个代码但是 respone 是 null 即使状态代码是 200 ,我在 otpcall 之外做了一些测试if 语句和响应效果很好
const login = (values) => {
let payload = {
"input": values.phone_number,
"password": values.password,
"user_agent":"postman",
"client_host":"local"
}
axios.post(loginUrl, payload = payload)
.then(resp => {
if (typeof resp !== 'undefined') {
if (resp.data.result.is_2fa_active) {
if (resp.data.result.default_2fa === "authenticator_app") {
setAuthenticatorApp(true)
}
if ( resp.data.result.default_2fa === "mobile" || resp.data.result.default_2fa === "email") {
let payloadOtp = {
"type": resp.data.result.default_2fa,
"input": values.phone_number,
"password": values.password,
}
axios.post(otpUrl, payloadOtp).then(response => {
setEmailOrSmsAuth(true)
return response
})
}
}
}
})
}
当我调用这个 api 时,otp api 状态代码是 200,有效负载具有我想要的所有值,但响应为空
请帮我看看我的代码有什么问题!
我相信你的问题涉及到所有问题。
因为 .then
仅在 POST 请求完成后运行,所以只能在该回调内部访问响应。预期的解决方案是将所有逻辑移到回调中,但如果您有很多后续逻辑,这可能会变得混乱。
另一种(通常是首选)方法是对请求使用 Promise,然后使用 await
等待响应。然后,这会将 return 结果传递给具有正确范围的其余逻辑,允许您像使用任何其他变量一样使用它。我不知道您的 POST 请求使用的是什么库或方法,但是没有针对您想要的库的 Promises 的预制解决方案,您可以将您的请求包装在 Promise 中并调用它。语法类似于:
const postApiPromise = (loginUrl, payload ) => {
return new Promise((resolve, reject) => {
service.post_api(loginUrl, payload = payload) => {
if (err) return reject(err)
resolve(data)
})
})
}
我了解到这个问题来自于服务器。以下是我解决此问题的解决方案。
代码
const login = (values) => {
setIsLoading(true);
sessionStorage.setItem('mobile', values.phone_number); //set mobile into local session
sessionStorage.setItem('password', values.password); //set password into local session
const loginUrl = `${BASE_URL(IAM_APP)}/auth/login/`
let payload = {
"input": values.phone_number,
"password": values.password,
"user_agent": "postman",
"client_host": "local"
}
axios.post(loginUrl, payload) //request for login if 2factor authentication is true then send to another component
.then(resp => {
if (resp !== undefined){
if (resp.data?.result?.access_token) {
setToken(resp.data.result)
setTimeout(() => {
window.location.href = DASHBOARD
}, 1000);
} else if (resp?.data?.result.is_2fa_active === true) {
if (resp.data.result.default_2fa === "authenticator_app") {
history.push(LOGIN2FAAUTHENTICATOR);
} else if (resp.data.result.default_2fa === "email") {
history.push(LOGIN2FAEMAIL);
} else if (resp.data.result.default_2fa === "mobile") {
history.push(LOGIN2FASMS);
}
}
}
})
}
then for example in the LOGIN2FASMS route solve issue like this
const otpSent = () => { //send otp to mobile
const otpUrl = `${BASE_URL(IAM_APP)}/auth/2fa/otp/`
let payloadOtp = {
"type": "mobile",
"input": mobile,
"password": password,
}
return axios.post(otpUrl, payloadOtp)
}
useEffect(() => {
otpSent().then(resp => {
if (resp?.data?.result === 'otp sent'){
}
else
otpSent()
}
)
}, [mobile, password]);
yeah, its done ;)
我想 api 发送 otp 但是当 default_2fa 是移动的或 email.write 这个代码但是 respone 是 null 即使状态代码是 200 ,我在 otpcall 之外做了一些测试if 语句和响应效果很好
const login = (values) => {
let payload = {
"input": values.phone_number,
"password": values.password,
"user_agent":"postman",
"client_host":"local"
}
axios.post(loginUrl, payload = payload)
.then(resp => {
if (typeof resp !== 'undefined') {
if (resp.data.result.is_2fa_active) {
if (resp.data.result.default_2fa === "authenticator_app") {
setAuthenticatorApp(true)
}
if ( resp.data.result.default_2fa === "mobile" || resp.data.result.default_2fa === "email") {
let payloadOtp = {
"type": resp.data.result.default_2fa,
"input": values.phone_number,
"password": values.password,
}
axios.post(otpUrl, payloadOtp).then(response => {
setEmailOrSmsAuth(true)
return response
})
}
}
}
})
}
当我调用这个 api 时,otp api 状态代码是 200,有效负载具有我想要的所有值,但响应为空 请帮我看看我的代码有什么问题!
我相信你的问题涉及到所有问题。
因为 .then
仅在 POST 请求完成后运行,所以只能在该回调内部访问响应。预期的解决方案是将所有逻辑移到回调中,但如果您有很多后续逻辑,这可能会变得混乱。
另一种(通常是首选)方法是对请求使用 Promise,然后使用 await
等待响应。然后,这会将 return 结果传递给具有正确范围的其余逻辑,允许您像使用任何其他变量一样使用它。我不知道您的 POST 请求使用的是什么库或方法,但是没有针对您想要的库的 Promises 的预制解决方案,您可以将您的请求包装在 Promise 中并调用它。语法类似于:
const postApiPromise = (loginUrl, payload ) => {
return new Promise((resolve, reject) => {
service.post_api(loginUrl, payload = payload) => {
if (err) return reject(err)
resolve(data)
})
})
}
我了解到这个问题来自于服务器。以下是我解决此问题的解决方案。
代码
const login = (values) => {
setIsLoading(true);
sessionStorage.setItem('mobile', values.phone_number); //set mobile into local session
sessionStorage.setItem('password', values.password); //set password into local session
const loginUrl = `${BASE_URL(IAM_APP)}/auth/login/`
let payload = {
"input": values.phone_number,
"password": values.password,
"user_agent": "postman",
"client_host": "local"
}
axios.post(loginUrl, payload) //request for login if 2factor authentication is true then send to another component
.then(resp => {
if (resp !== undefined){
if (resp.data?.result?.access_token) {
setToken(resp.data.result)
setTimeout(() => {
window.location.href = DASHBOARD
}, 1000);
} else if (resp?.data?.result.is_2fa_active === true) {
if (resp.data.result.default_2fa === "authenticator_app") {
history.push(LOGIN2FAAUTHENTICATOR);
} else if (resp.data.result.default_2fa === "email") {
history.push(LOGIN2FAEMAIL);
} else if (resp.data.result.default_2fa === "mobile") {
history.push(LOGIN2FASMS);
}
}
}
})
}
then for example in the LOGIN2FASMS route solve issue like this
const otpSent = () => { //send otp to mobile
const otpUrl = `${BASE_URL(IAM_APP)}/auth/2fa/otp/`
let payloadOtp = {
"type": "mobile",
"input": mobile,
"password": password,
}
return axios.post(otpUrl, payloadOtp)
}
useEffect(() => {
otpSent().then(resp => {
if (resp?.data?.result === 'otp sent'){
}
else
otpSent()
}
)
}, [mobile, password]);
yeah, its done ;)