Node.js+SQLite3:Express接口中数据库查询代码实现咨询
Express + SQLite3 接口取数方案
嘿,我来给你理清楚这个问题——你需要把SQLite3的查询代码放在dataArray定义之后、res.end()之前的位置,因为得先完成数据库查询,把结果塞进dataArray,再返回给前端。毕竟SQLite3的操作是异步的,不能还没拿到数据就直接返回空数组。
下面给你两种常用的写法,从基础到优雅版本都有:
1. 原生回调写法(简单直接)
适合逻辑不复杂的场景,直接用sqlite3的回调函数处理查询结果:
const express = require('express'); const sqlite3 = require('sqlite3').verbose(); const app = express(); // 先打开数据库连接 const db = new sqlite3.Database('./your-db-file.db', (err) => { if (err) console.error('数据库连接失败:', err.message); console.log('成功连接到SQLite数据库'); }); app.get('/products', function(req, res) { let dataArray = []; // 注意这里把Content-Type改成application/json更符合HTTP标准 res.writeHead(200, {'Content-Type': 'application/json'}); // 执行SELECT查询,把结果存入dataArray db.all('SELECT * FROM products', (err, rows) => { if (err) { // 处理查询错误,返回500错误 res.writeHead(500, {'Content-Type': 'application/json'}); return res.end(JSON.stringify({error: `查询失败: ${err.message}`})); } // 查询到的rows就是所有结果,直接赋值给dataArray dataArray = rows; // 现在再返回数据 res.end(JSON.stringify(dataArray)); }); }); const PORT = 3000; app.listen(PORT, () => console.log(`服务器运行在端口 ${PORT}`));
2. Promise+Async/Await写法(更优雅)
原生回调嵌套多了容易陷入“回调地狱”,把查询封装成Promise,用async/await让代码更易读:
const express = require('express'); const sqlite3 = require('sqlite3').verbose(); const app = express(); const db = new sqlite3.Database('./your-db-file.db', (err) => { if (err) console.error('数据库连接失败:', err.message); console.log('成功连接到SQLite数据库'); }); // 封装一个Promise版的通用查询函数 function runQuery(sql) { return new Promise((resolve, reject) => { db.all(sql, (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } app.get('/products', async function(req, res) { try { // 用await直接获取查询结果,存入dataArray const dataArray = await runQuery('SELECT * FROM products'); res.writeHead(200, {'Content-Type': 'application/json'}); res.end(JSON.stringify(dataArray)); } catch (err) { // 捕获错误并返回 res.writeHead(500, {'Content-Type': 'application/json'}); res.end(JSON.stringify({error: `查询失败: ${err.message}`})); } }); const PORT = 3000; app.listen(PORT, () => console.log(`服务器运行在端口 ${PORT}`));
几个关键提醒:
- 绝对不能在数据库查询完成前调用
res.end(),否则返回的就是空的dataArray,因为异步操作还没结束。 - 一定要处理错误情况,不然接口遇到数据库问题会直接挂掉,或者返回无意义的响应。
- 响应头的
Content-Type用application/json比你原来写的text/json更标准,主流前端框架也能更好识别。
内容的提问来源于stack exchange,提问作者koen
相关产品推荐
相关产品推荐

