node.js - 我如何每分钟发送此登录请求?

标签 node.js reactjs express axios

我想每分钟向我的 users/login API 发送一个请求,如果我将 setinterval (login , 6*6000) 放在端点中,则不适用于 async wait ,如果我将其放在 index.html 中,则不会在其他页面和控制台中声明登录函数:login 未在配置文件中声明

登录端点位于React目录中:

export const login = async user => {
    try {
        const response = await axios.post('users/login', {
            username: user.username,
            password: user.password
        });
        localStorage.setItem('usertoken', response.data);
        return response.data;
    }
    catch (err) {
        console.log(err);
    }
}

这是 React 中的登录处理:

onSubmit(e) {
    e.preventDefault();
    const user = {
        username: this.state.username,
        password: this.state.password
    };

    login(user).then(res => {
        if (res) {  
            this.props.history.push(`/profile`);
        } else {
            console.log('couldnt login');
        }
    })
}

Edit : I have done this, it is making a request but not logging in:

export const login = async user => {
    try {
        setInterval(async () => {
            const response = await axios.post('users/login', {
                username: user.username,
                password: user.password
            });
            localStorage.setItem('usertoken', response.data);
            return response.data;
        } , 6*1000);
    } catch (err) {
        console.log(err);
    }
}

最佳答案

顾名思义,您的登录函数应该简单地执行以下操作:

/**
 * Performs login and returns the promise
 * Sets the user to local storage on success
 * Logs and throws on failure
 */
export const login = (user) => (
    axios.post('users/login', {
        username: user.username,
        password: user.password
    }).then((response) => {
        localStorage.setItem('usertoken', response.data);
        return response.data;
    }).catch((error) => {
        console.log('Login Failed');
        throw error;
    })
);

然后,您的 onSubmit 函数应该自行处理此登录循环。我还在组件中添加了 loginInterval 属性以及 stopLoggingIn 方法,以防您最终想要无限期地停止登录。

import { login } from 'somewhere';

// Component code...

/**
 * Performs login every minute
 */
onSubmit = (e) => {
    e.preventDefault();
    const user = {
        username: this.state.username,
        password: this.state.password
    };

    this.loginInterval = setInterval(() => {
        login(user).then((data) => {
            if (data) {  
                this.props.history.push('/profile');
            }
            else {
                console.log('Something went wrong');
            }
        });
    }, 60 * 1000);
}

/**
 * Clears the login interval
 * In case you want to stop logging in in a loop
 */
stopLoggingIn = () => {
    clearInterval(this.loginInterval);
}

// Rest of component code...

最后一点,您可能已经注意到我没有使用 asyncawait,这是因为您在您的情况下并不真正需要它们。重定向到应用程序仅在成功登录时执行,并且没有理由使用 await 阻止代码,因为我没有看到任何仅应在登录后执行且不在登录请求的回调中的关键语句。

关于node.js - 我如何每分钟发送此登录请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57108622/

相关文章:

node.js - Node 中第一次调用函数的时间

javascript - 解析流而不进行裁剪

reactjs - 运行测试时 Jest 绝对没有输出

javascript - 从 promise 对象(服务器端)获取值到客户端 index.html

javascript - setTimeout的实际延迟可能会更短吗?

javascript - 在 Slack 消息中格式化电话号码?

javascript - React - 使用 for 循环创建 x 个组件实例

angular - 你可以将 Angular 组件导出到 Sketch 中吗?

javascript - 在没有模板引擎的情况下将express路由到ng2

node.js - 如何保持用户登录? ExpressJS 和 Passport 有可能吗?