egg 不同controller 共享数据
发布于 6 年前 作者 Helovebai 6430 次浏览 来自 问答

egg框架下遇到的问题: 需求如下: 前端调用获取验证码的接口,返回相应的code,完了提交表单,后端验证验证码输入是否正确。 本人思路如下: 在controller中新建全局变量codeMap,绑在global上,在获取验证码的方法中添加code,在验证表单的接口,循环codeMap,返回相应结果。 出现错误如下: egg dev本地调试完全ok,但是上线就会出现codeMap中找不到获取验证码时添加的code,所以会报错。

希望各位大神赐教,我已经快疯了 =,=。。。。。

10 回复

因为正式环境是多进程的。。。 你应该学习下数据库或 redis 之类的外部缓存

egg 生产环境运行时是多进程模式相互隔离的。我之前也遇到相同的情况调试正常作生产环境测试时傻了,数据量很小不考虑外部存储于是就通过消息机制往agent里面存取了。 唯一的问题是不支持传递 map 类型数据(没试过set)。

使用session,https://github.com/eggjs/egg-session,建议用redis。 生成的code保存在session里,用户提交,与session里的code比较。为什么要创建成全局变量?node.js一般不推荐使用全局变量。

redis 试试可以不。我一般都是放 redis 里面的。 当然啦,我是个假后台。

@waitingsong 大哥, agent怎么 用呀 ? 能说的稍微详细点儿么 ? 谢谢谢谢

缓存服务赶紧用起来吧~~

下发

  1. 用户向后端请求验证码–>带上key标识.
  2. 检查redis是否存在用户的验证码
  3. 如果有,就取出来发给前端 || 如果没有,你的程序生成一个,设置有效期存到redis,发送给前端

校验

  1. 用户提交验证码和用来存储redis时用到的key标识到后端
  2. 后端获取 去redis里做匹配
  3. 返回匹配结果

这种数据使用redis/mongodb/mysql额外的存储即可,否则多进程、服务重启等就容易导致数据丢失或不一致。

来自✨ Node.js开源项目精选

回到顶部