NodeJS Express中post回调内定义变量外部访问报未定义错误如何解决
问题根因
- 作用域限制:你使用
const在app.post的回调函数内部声明了clientResolution,const属于块级作用域,仅在声明它的函数块内部可访问,函数外部自然无法读取,直接调用就会抛出未定义错误。 - 异步执行时序问题:Express的路由回调是异步触发的,只有当客户端向
/size接口发起POST请求时,回调内部的代码才会运行。你写在路由外的console.log是服务启动时同步执行的,此时还没有任何请求触发回调,就算把变量提到全局作用域,这时候打印也拿不到有效值。
另外你代码里存在冗余逻辑:客户端提交的clientwh本身就是JSON序列化后的字符串,直接用JSON.parse解析即可,不需要用正则匹配提取数值,写法更简洁也不容易出错。
修复示例代码
// 先在全局作用域声明变量存储分辨率数据 let clientResolution = []; // 中间件注册要放在路由定义前,不要放在业务逻辑里 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); // 返回客户端脚本的逻辑,放在对应的路由中即可 app.get('/', (req, res) => { res.send(` <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> var size = { clientwidth: window.innerWidth, clientheight: window.innerHeight }; var objectData = JSON.stringify(size); $.post('/size', { clientwh: objectData }); </script> `); }) // 接收分辨率的路由 app.post('/size', (req, res) => { // 直接解析JSON,无需正则匹配 const sizeData = JSON.parse(req.body.clientwh); clientResolution = [sizeData.clientwidth, sizeData.clientheight]; res.json({ok: true}); console.log('收到客户端分辨率:', clientResolution); // 如果有其他逻辑需要用到这个数据,在这里调用对应的处理函数即可 // handleClientResolution(clientResolution) });
注意事项
如果需要拿到分辨率后做后续处理,不要把处理逻辑写在全局同步执行的位置,要么放到路由回调内部调用,要么监听对应的事件触发处理逻辑,避免因为时序问题拿到空值。
内容的提问来源于stack exchange,提问作者user13121687
相关产品推荐
相关产品推荐

