Node.js 是否可以从Express中的路由调用我的reducer中的actions函数?

Node.js 是否可以从Express中的路由调用我的reducer中的actions函数?,node.js,reactjs,express,react-redux,Node.js,Reactjs,Express,React Redux,我在Express中有一个路由,我想调用从我的减速机导入的操作函数: /* initial state */ export var usersStartState = { isAccountVerified: false, }; /* action types */ export const actionTypes = { IS_ACCOUNT_VERIFIED: 'IS_ACCOUNT_VERIFIED', }; /* reducer(s) */ export default fu

我在Express中有一个路由,我想调用从我的减速机导入的操作函数:

/* initial state */
export var usersStartState = {
  isAccountVerified: false,
};

/* action types */
export const actionTypes = {
  IS_ACCOUNT_VERIFIED: 'IS_ACCOUNT_VERIFIED',
};

/* reducer(s) */
export default function users(state = usersStartState, action) {
  switch (action.type) {
    case actionTypes.IS_ACCOUNT_VERIFIED:
      return Object.assign({}, state, { isAccountVerified: true });
    default:
      return state;
  }
}

/* actions */
export const hasBeenVerified = () => {
  return { type: actionTypes.IS_ACCOUNT_VERIFIED };
};
这是我的路线:

var router = require('express').Router();
var passport = require('passport');
var User = require('../models/UserModel');
var Token = require('../models/TokenSchema');
import { hasBeenVerified } from '../../store/reducers/users/index';

import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';

router.route('/confirmation/:token').get((req, res, next) => {
  var usersToken = req.params.token;
  try {
    Token.findOne({ token: usersToken }, function(err, token) {
      if (err)
        return res.status(404).send({
          type: 'not-verified',
          msg: 'We were unable to find a valid token. Your token my have expired.'
        });
      // If we found a token, find a matching user
      User.findOne({ _id: token._userId, email: req.body.username }, function(err, user) {
        if (err)
          return res
            .status(404)
            .send({ msg: 'We were unable to find a user for this token.' });
        if (user.isVerified)
          return res.status(400).send({
            type: 'already-verified',
            msg: 'This user has already been verified.'
          });

        // Verify and save the user
        user.isVerified = true;
        user.save(function(err) {
          if (err) {
            return res.status(500).send({ msg: err.message });
          }
        });
      });
      hasBeenVerified(); // firing it here
      console.log('hasBeenVerified();', hasBeenVerified());
      res.redirect('/confirmed');
    });
  } catch (err) {
    return next(err);
  }
});
我试图设置一个
已验证();log('hasBeenVerified()',hasBeenVerified())

并且它会在终端中返回一个输出:

hasBeenVerified(); { type: 'IS_ACOUNT_VERIFIED' }
但它不会改变商店的初始状态

export var usersStartState = {
  isAccountVerified: false, //still false after the `hasBeenVerified` executed
};

如评论中所述,您需要:

  • 将前端状态的必要部分发送到后端
  • 您的后端使用发送的数据进行验证
  • 后端将验证状态响应到前端
  • 前端使用此验证数据更新Redux

下面是概述上述步骤所需的“肉和土豆”。虽然,-我建议你用叉子叉起来,在本地运行,以真正理解这一点

后端:

server.js

const express=require('express');
const cors=需要(“cors”);
常量app=express();
常数端口=8002;
使用(express.json());
use(express.urlencoded({extended:false}));
应用程序使用(cors());
应用程序发布('/authorize',(请求、回复)=>{
如果(req.body.un=='a'&&req.body.pw=='a'){
res.status(200).send('true');
}否则{
res.status(200).send('false');
}
});
//404
应用程序使用((请求、回复)=>{
res.status(404).send(“找不到它!”);
});
应用程序侦听(端口,()=>{
log(`Server监听端口${port}`);
});
前端:

App.js

import React,{Component}来自“React”;
从“react router dom”导入{BrowserRouter,Link};
从“/Routes”导入路由;
使用Redux从“/Redux/containers”导入;
类应用程序扩展组件{
状态={
联合国:“,
pw:“
};
handleUnInput=事件=>{
这是我的国家({
…这个州,
un:event.target.value
});
};
handlePwInput=事件=>{
这是我的国家({
…这个州,
pw:event.target.value
});
};
handleLogout=()=>{
this.props.setAccountStatus(false);
}
handleLogin=()=>{
取回(“http://localhost:8002/authorize", {
方法:“张贴”,
标题:{“内容类型”:“应用程序/json”},
正文:JSON.stringify({un:this.state.un,pw:this.state.pw})
})
。然后(res=>res.text())
。然后(数据=>{
如果(数据==“真”){
this.props.setAccountStatus(true);
}否则{
警报(“凭据不正确!”);
}
})
.catch(err=>console.log(“出错了!”+err.message));
};
render(){
const{isAccountVerified}=this.props.state;
返回(
家

受保护的 {是否已验证帐户( 注销 ) : ( 尝试访问上面的“受保护”路由。除非您已登录 在这种情况下是行不通的。

用户名:
密码:
用户名是“a”,密码是“a”
登录 )} ); } } 使用Redux导出默认值(应用程序);
Err,那么您是在前端还是后端使用Redux?我甚至不确定
是如何在后端验证的。。简言之,不,你不能这样做。您需要使用必要的数据响应前端,以便在前端进行验证,或者将必要的数据发送到后端,以便在后端进行验证和重定向,等等。。根据需要。要进一步排除故障,我需要查看更多代码。。。你在GitHub上有这个吗?明白了。。。这样做是有道理的,但它不更新您的状态的原因是因为React代码在浏览器中运行,而Express代码在服务器上运行——它们彼此都不知道。您需要通过XHR请求将适当的状态发送到后端,或者使用
res.send()
。是将必要的数据发送到前端。给我一分钟,可能需要30分钟左右。@AntonioPavicevac Ortiz你是在使用带挂钩的Redux吗?只是想建立一个例子,反映你正在使用的。非常感谢马特!!!我等不及要试一试了!今晚我和我女儿在一起,但明天早上我会试一试的!别担心!希望你们玩得开心:)-我也在Heroku上发布了代码,所以如果你想,哇!真是太棒了,我的朋友!非常感谢!!!