Node.js 是否可以从Express中的路由调用我的reducer中的actions函数?
我在Express中有一个路由,我想调用从我的减速机导入的操作函数: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
/* 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上发布了代码,所以如果你想,哇!真是太棒了,我的朋友!非常感谢!!!