TypeError:无法读取reactjs中未定义的属性'then'

问题描述 投票:0回答:1

我使用redux将nodejs后端与reactjs连接起来。但每次我提交登录表单时,都会收到类似这样的错误。

TypeError:无法读取未定义的属性'then'

我不知道这是从哪里来的。我试图在StackOverflow上找到这个,我确实找到了一些说我需要转换然后作为一个函数,但我仍然得到相同的错误。

这是我的代码

loginPage.js

class LoginPage extends Component {
    submit = (data) => this.props.login(data).then(() => this.props.history.push('/'));
    render() {
        return (
            <div>
                <h1>LoginPage</h1>
                <LoginForm submit={this.submit}/>
            </div>
        );
    }
}

loginform.js

onSubmit = (e) => {
        e.preventDefault();
        const errors = this.validate(this.state.data);
        this.setState({ errors });
        if (Object.keys(errors).length === 0) {
            this.setState({ loading: true});
            this.props
                .submit(this.state.data)
                    .catch(err => this.setState({ errors: err.response.data.errors, loading: false }));

        }
    };

api.js

import axios from 'axios';
export default {
    user: {
        login: (credentials) => 
            axios.post('/api/auth', { credentials })
                .then(res => res.data.user),
    }
}

动作/ auth.js

import { USER_LOGGED_IN } from '../types';
import api from '../api';

export const userLoggedIn = (user) => ({
    type: USER_LOGGED_IN,
    user
})



export const login = (credentials) => (dispatch) => {
    api.user.login(credentials)
        .then(user => {
            dispatch(userLoggedIn(user))
        });
}

后端/路线/ auth.js

import express from 'express';
import User from '../Models/User';
const router = express.Router();

router.post('/', (req, res) => {
    const { credentails } = req.body;
    User.findOne({email: req.body.email}).then(user => {
        if (user.email) {
            res.json({success: true})
        } else {
            res.status(400).json({errors: {global: "Invalid Credentials"}})
        }
    })

})

loginForm.js

import React, {Component} from 'react';
import LoginForm from '../Forms/LoginForm';
import PropTypes from 'prop-types'
import { connect } from 'react-redux';
import { login } from '../../actions/auth';
class LoginPage extends Component {
    submit = (data) => this.props.login(data).then(() => this.props.history.push('/'));
    render() {
        return (
            <div>
                <h1>LoginPage</h1>
                <LoginForm submit={this.submit}/>
            </div>
        );
    }
}

LoginPage.propTypes = {
  history: PropTypes.shape({
    push: PropTypes.func.isRequired
  }).isRequired,
  login: PropTypes.func.isRequired
};

export default connect(null, {login})(LoginPage);
javascript reactjs
1个回答
0
投票

您尚未为登录功能指定任何Promise。因此,你得到一个undefined错误。

您也可以通过两种方式执行此操作:

1.承诺

api.user.login(credentials)
         .then(user => {
               dispatch(userLoggedIn(user))
             });

Api.js

import axios from 'axios';
    export default {
        user: {
            login: new Promise(credentials, resolve, reject) => 
                axios.post('/api/auth', { credentials })
                    .then(res => resolve(res.data.user))),
        }
    }

2.回调函数。

动作/ auth.js

api.user.login(credentials,
                 (user => {
                    dispatch(userLoggedIn(user))
                 })
              );

Api.js

import axios from 'axios';
export default {
    user: {
        login: (credentials, callback) => 
            axios.post('/api/auth', { credentials })
                .then(res => callback(res.data.user)),
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.