如何让Express服务器将独立Provider获取的数据返回给客户端
问题核心原因
你现在拿到undefined的根本原因是数据库查询属于异步IO操作,你当前的同步写法无法等待数据库返回结果就提前执行了return,所以拿到的是空值。你的Provider分层思路是对的,不需要在Provider里引入res对象,只要把异步逻辑处理对就能拿到返回值。
第一步:改造provider.js的异步逻辑
把getMethod改为async异步函数,内部等待数据库操作完成后再返回结果:
class getSomething extends abstractClass { // 加async关键字标记为异步函数 async getMethod(id) { this.id = id; // 基于id从数据库获取数据,数据库操作前加await try { // 此处替换为你实际的数据库查询方法 const data = await db.query('select * from 表名 where id = ?', [id]) return data; } catch (err) { return 'error'; } }; };
第二步:改造Express路由的处理逻辑
把路由回调改为async函数,调用getMethod时用await等待异步结果返回后再执行res.send:
// 回调函数前加async关键字 server.get("/someurl*", async (req, res) => { let name = req.query.name; let id = req.query.id; if (isValid(name) && isValid(id)) { let provider = new getSomething(); // 加await等待异步方法返回结果 const result = await provider.getMethod(id); res.send(result); }; });
可选优化:添加异常处理
更规范的写法可以在路由层加try/catch捕获异常,提高服务稳定性:
server.get("/someurl*", async (req, res) => { try { let name = req.query.name; let id = req.query.id; if (!isValid(name) || !isValid(id)) { return res.status(400).send('参数非法'); } let provider = new getSomething(); const result = await provider.getMethod(id); if (result === 'error') { return res.status(500).send('数据查询失败'); } res.send(result); } catch (err) { res.status(500).send('服务器内部异常'); } });
内容的提问来源于stack exchange,提问作者gabrielesan
相关产品推荐
相关产品推荐

