Node.js Express中SQLite3服务层查询无返回结果问题求助
Node.js Express + SQLite3 抽离服务层后无法获取数据的问题解决
问题描述
在Node.js Express项目中使用SQLite3数据库,原本在router.js中编写查询逻辑时可正常获取所有数据,但将查询逻辑抽离至dbService服务层后,却无法获取返回结果,尝试在服务层使用async/await仍未解决问题。
现有代码
router.js
const dbService = require("../services/dbService/"); router.get("/users", (req, res, next) => { try { res.status(200).send({ data: dbService.getAllUsers(); }) return; } catch(err) { next(err); } });
dbService.js
const db = require("../db/database.js"); module.exports = { getAllUsers() { const sql = "select * from users"; db.all(sql,[], (err, rows) => { return {"data": rows}; }); } }
问题原因
- 异步回调返回值无效:SQLite3的
db.all是基于回调的异步API,getAllUsers内部回调函数里的return仅在回调作用域内生效,不会作为getAllUsers的返回值,因此router调用时拿到的是undefined。 - async/await未正确适配:直接使用
async/await但未将异步操作包装为Promise,async/await仅对Promise类型的异步操作有效,原代码未满足这个前提,所以无法生效。
解决方案
将服务层的异步操作包装为Promise,同时在路由处理函数中使用async/await等待结果返回。
修改后的代码
dbService.js
const db = require("../db/database.js"); module.exports = { getAllUsers() { // 用Promise封装异步查询逻辑 return new Promise((resolve, reject) => { const sql = "select * from users"; db.all(sql, [], (err, rows) => { if (err) { reject(err); // 传递错误给上层捕获 return; } resolve({"data": rows}); // 成功时返回查询结果 }); }); } }
router.js
const dbService = require("../services/dbService/"); // 路由处理函数改为async函数 router.get("/users", async (req, res, next) => { try { // 用await等待Promise执行完成,获取结果 const result = await dbService.getAllUsers(); res.status(200).send(result); return; } catch(err) { next(err); // 捕获并传递错误 } });
说明
- 用Promise封装
db.all的异步逻辑,确保查询结果能通过resolve返回,错误通过reject抛出,让上层可以捕获处理。 - 路由处理函数声明为
async,使用await等待服务层的Promise执行完成,这样就能正确获取数据库返回的数据。
内容的提问来源于stack exchange,提问作者Maik Lowrey
相关产品推荐
相关产品推荐

