You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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};
    });
  }
}

问题原因

  1. 异步回调返回值无效:SQLite3的db.all是基于回调的异步API,getAllUsers内部回调函数里的return仅在回调作用域内生效,不会作为getAllUsers的返回值,因此router调用时拿到的是undefined。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:30:43