express在做网站开发的时候造成用户的数据混乱,该如何处理?
发布于 6 年前 作者 kevin1220 2838 次浏览 来自 问答

我在做一个微信的分享功能,要求分享的时候需要带上分享者的ID,然后我通过前台的脚本,在当前用户执行分享动作的时候,把ID也带上,传到后台,因为微信在获取用户信息的时候,会有一个跳转到回调地址的过程,比如我当前请求的地址是http://www.wit-orange.com?app=ballgame&shareOpenid=xxxx,在调用微信的获取用户信息接口的时候,回有一个重定向到http://www.wit-orange.com 的动作,这个时候,我后台获取shareOpenid的代码如下:

	router.get('/', function(req, res, next) {
		  if (req.query.app !== undefined) {
			  console.log(123);
			  global.appflag = req.query.app;
			  if (req.query.shareOpenid !== undefined) {
				  var shareOpenid = req.query.shareOpenid;
			  } else {
				  var shareOpenid = undefined;
			  }
			  if (req.query.bymp !== undefined) {
				  var bymp = req.query.bymp;
			  } else {
				  var bymp = undefined;
			  }
		  }
		  console.log("appflag:"+global.appflag);
		  console.log("shareOpenid:"+shareOpenid);
		  console.log("bymp:"+bymp);
	});

我发现在完成跳转到回调地址之后,获取到的shareOpenid为undefined, 尝试着把shareOpenid定义在路由的外面,这样可以成功的获取到shareOpenid的值,但是问题来了,当我有两个用户同时访问这个路由的时候,shareOpenid的值就出现的混乱情况,我看了一下,原因应该是在路由器外面定义的变量,在每个路由中都可以访问到,当A用户在访问的同时,B用户也在访问的时候,A用户访问到了B用户带过来的shareOpenid的值,于是 A用户就获取到了B用户的信息,造成了信息的混乱。 对于这样的情况,express是怎么处理的,是否有大神遇到过这样的问题,又是怎么处理这个问题的?

我尝试着使用nodejs的全局变量global来存储我的变量,但是这样的话,shareOpenid就没法根据不同用户带过来的值实时的改变了,这样也不符合当前的需求。

12 回复

一般都是存到 session 里面的, 你可以搜一下 express-session。

@IchiNiNiIchi 恩。session应该是可以的,我尝试一下,我还想了解一下,是否还有其他的方法可以实现这样的效果,nodejs有没有那种响应变量可以达到这样的效果的?

没有太看明白你的需求,

你的分享地址是别人打开这个链接,会通过微信网页授权来获取用户信息吗?如果是这样的话,微信那里的redirect_uri参数是可以自己定义的,你可以给回调地址加上你的分享参数吧 redirect_uri 是 授权后重定向的回调链接地址,请使用urlencode对链接进行处理

@jiangli373 好像微信的回调链接地址是不能自定义参数的吧? 否则就接口调用就失败了。

@jiangli373 确实是不能自定义参数,否则报redirect_uri参数错误,我已经使用了urlencode处理的,后台日志显示: url:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx00a1c8d384eff1f3&redirect_uri=http%3A%2F%2Fwww.wit-orange.com%26app%3Dhbzl%26shareOpenid%3Dundefined%26bymp%3Dundefined&response_type=code&scope=snsapi_userinfo&state=mystate#wechat_redirect

请问你之前试过这样自定义参数吗? 是否成功了? 我是不是有什么理解不对的地方?

@IchiNiNiIchi 我尝试了一下,使用session来存储变量,但是在回调的时候,session是否会变成另外一个呢? 我感觉做回调的时候,session重置了。

@kevin1220 存储的那段代码跟 session 设置的代码能够发一下吗?

@kevin1220 我刚才做了测试,

redirect_uri = ‘http%3A%2F%2Fweipay.hangdali.com%2Flogincallback%3Ftime%3Djiangli’

我加了一个time参数 值为jiangli

然后这个是获取code后,回调的地址:

untitled2.png

@kevin1220

你的url

http://www.wit-orange.com&app=hbzl&shareOpenid=undefined&bymp=undefined

看下这个www.wit-orange.com是否设置成为了业务域名

untitled1.png

另外就是你这个url后面的参数拼的不对,应该是

http://www.wit-orange.com?app=hbzl&shareOpenid=undefined&bymp=undefined

@jiangli373 不好意思,是我粗心的,谢谢你,我的问题解决了,之前估计也是这个错误导致的参数异常。非常感谢。

@IchiNiNiIchi 使用session来存储那段代码,我已经删除了,已经使用其他的方法解决这个问题了,谢谢你的帮助。

关于session这个,有几个地方还需要请教一下您,302跳转的前后,session是否是同一个,如果是同一个的话,应该就可以使用session来存储我的那些变量,如果不是同一个的话,那存储之后的变量,跳转之后的session中也找不到我之前存储的变量了。

@kevin1220 一般来说是同一个,因为 session 本来就是用来放在连续的请求保持状态的东西。稍微搜了下

Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端)。客户端与服务器端就是通过这个key来确认客户端的身份,通常这个key为SessionID。 一般情况下,SessionID以Cookie的形式保存在浏览器中,在不使用Cookie的情况下,也可以将这个SessionID嵌入到访问网页的URL中。

回到顶部