【发布时间】:2018-01-10 17:16:50
【问题描述】:
对于我的项目,我使用的是Redux-Form。
如果密码正确,我想验证密码并自动将用户登录到系统。用户登录后,我更新了一些内部 redux 状态。为此,我使用了带有操作方法的 redux thunk。
我面临的问题是 redux thunk 操作无法返回异步 redux-form 验证所需的 Promise。
这是我遇到的错误:
asyncValidate function passed to reduxForm must return a promise
有人知道问题出在哪里吗?
这是我正在使用的代码:
asyncValidate.js
import {logIn} from '../user/actions';
const asyncValidate = (values, dispatch) => {
return logIn(values.booker.email, values.booker.password);
}
export default asyncValidate
用户登录操作
export const logIn = (email, password) => (dispatch) =>
new Promise(function (resolve, reject) {
axios.post('/login_check', qs.stringify({
_username: email,
_password: password,
_csrf_token: CSRF_TOKEN
}), ajaxConfig)
.then(response => {
if (response.data.success !== true) {
dispatch({
type: LOG_IN_ERROR,
payload: response.data.message
});
reject(response.data.message);
}
else {
dispatch({
type: LOG_IN_SUCCESS,
payload: response.data.user
});
resolve();
}
})
.catch((error) => {
dispatch({
type: LOG_IN_ERROR,
payload: error
});
reject(error);
})
});
编辑 1:
尝试了@Ravindra Ranwala 建议的代码,但我仍然遇到同样的错误:
@Emrys Myrooin 建议将代码从操作移动到 asyncValidation 函数,但当用户(本例中为我)输入错误密码时,Redux-Form 不会触发任何错误。
这是新的 asyncValidate 函数的代码:
import {LOG_IN_ERROR, LOG_IN_SUCCESS, CSRF_TOKEN} from '../booker/actions';
import axios from 'axios';
const qs = require('qs');
const ajaxConfig = {
headers: {"X-Requested-With": "XMLHttpRequest"}
};
const asyncValidate = (values, dispatch) => {
console.log(values);
return new Promise(function (resolve, reject) {
axios.post('/login_check', qs.stringify({
_username: values.booker.email,
_password: values.booker.password,
_csrf_token: CSRF_TOKEN
}), ajaxConfig)
.then(response => {
console.log(response);
if (response.data.success !== true) {
dispatch({
type: LOG_IN_ERROR,
payload: response.data.message
});
reject(response.data.message);
}
else {
dispatch({
type: LOG_IN_SUCCESS,
payload: response.data.user
});
resolve();
}
})
.catch((error) => {
dispatch({
type: LOG_IN_ERROR,
payload: error
});
reject(error);
})
})
}
export default asyncValidate
编辑 2. 来自 cmets 的更新代码
使用此代码,一旦密码字段触发模糊事件,我就会收到此错误:
Uncaught Error: asyncValidate function passed to reduxForm must return a promise
ajax 请求完成后,我收到了我想要从头开始但密码字段未验证的验证错误消息...
这是ajax请求完成后的错误:
asyncValidate.js?9b4c:19 Uncaught (in promise) Error: Bad credentials.
asyncValidate 函数:
import {logInError, logInSuccess, CSRF_TOKEN} from '../booker/actions';
import axios from 'axios'
const qs = require('qs')
const ajaxConfig = {
headers: { 'X-Requested-With': 'XMLHttpRequest' },
}
const asyncValidate = (values, dispatch) => {
axios
.post(
'/login_check', qs.stringify({
_username: values.booker.email,
_password: values.booker.password,
_csrf_token: CSRF_TOKEN,
}), ajaxConfig)
.then(response => {
console.log(response);
if (response.data.success)
dispatch(logInSuccess(response.data.user))
else
throw new Error(response.data.message)
})
.catch(error => {
dispatch(logInError(error.message))
throw error
})
}
export default asyncValidate
减速器动作:
export const logInSuccess = response => ({
type: LOG_IN_SUCCESS,
payload: response
});
export const logInError = (response) => ({
type: LOG_IN_ERROR,
payload: response
});
【问题讨论】:
标签: reactjs redux react-redux redux-form redux-thunk