如何通过HTTP GET请求在函数内部触发另一函数,解决返回undefined问题
该需求完全可以实现
问题根因
- Express 路由处理函数的入参是固定的,仅支持
request、response、next三个参数,你在somatoria中定义的第三个参数socketController会被自动填充为Express内置的next中间件函数,所以打印结果为[Function: next],并不是你要调用的同文件下的socketController方法 - 其次你没有处理socket客户端实例
client的存储问题,client仅在server.js的socket连接回调中存在,HTTP请求触发时需要拿到有效client实例才能正常执行socketController的send逻辑
改造方案
1. 调整controller.js代码
// 定义变量存储socket客户端实例,供HTTP请求调用时使用,多客户端场景可替换为Map按用户标识存储 let socketClient = null module.exports = { async socketController(client) { // socket连接时存储client实例 socketClient = client return client.send('mandando algo pro cliente') }, async somatoria(request, response) { // 校验socket客户端是否已连接 if (!socketClient) { return response.json({ code: 500, msg: 'socket客户端未连接,无法执行推送' }) } try { // 直接调用同模块下的socketController方法,注意异步方法要加await const execRes = await this.socketController(socketClient) return response.json({ code: 200, msg: '执行成功', data: execRes }) } catch (err) { return response.json({ code: 500, msg: '执行失败', error: err.message }) } } }
2. 调整server.js代码
// 引入controller模块 const controller = require('./controller.js') // socket连接监听逻辑 io.on('connection', (client) => { const interval = setInterval(() => { controller.socketController(client) clearInterval(interval) }) // 注册路由时用bind绑定this指向,确保somatoria内部可以正常访问this.socketController app.get('/somatoria', controller.somatoria.bind(controller)) })
注意事项
- 多客户端连接场景不要使用单个变量存储
client,建议用Map结构,按用户唯一标识(如用户ID、session ID)存储对应socket实例,HTTP请求触发时匹配对应客户端再执行推送 socketController是异步方法,调用时必须加await,否则拿到的是Promise对象而非实际执行结果- 路由绑定时如果不使用
bind,也可以将somatoria定义为箭头函数,避免this指向错误
内容的提问来源于stack exchange,提问作者Lucas Souza
相关产品推荐
相关产品推荐

