Express+SQLite用户添加函数:等待JS回调完成返回错误信息
问题描述
我正在搭建网站的认证与账号创建页面(刚上手Express和SQLite,逻辑简单)。当前的核心问题是:添加用户(或登录)的函数中,数据库交互的各步骤都依赖回调执行,但我需要等待所有回调完成后再结束函数,才能通过Express把包含数据库错误码(如用户已存在)、登录用户数据的信息返回给前端。
初始代码
function addUser(username,password) { var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => { if (err) { console.error("open error code : "+err.errno+" ; msg : "+err.message); } }); var statement=db.prepare("INSERT into users(username,password) VALUES(?,?)") statement.run(username,password,(err)=>{ if (err) { console.error("run error code : "+err.errno+" ; msg : "+err.message); } }); statement.finalize((err)=>{ if(err) { console.error("finalize error code : "+err.errno+" ; msg : "+err.message); } }) db.close() }
期望的服务器响应逻辑
我希望能通过addUser返回错误信息,实现如下响应逻辑:
app.post('/addUser',jsonParser,(req,res)=>{ res.status(200).send(JSON.stringify({error : addUser(req.body.username,req.body.password)})) });
但目前addUser无法返回执行过程中的err.errno——尝试过用变量存储错误信息,但函数主线程会在回调处理完错误前就结束;尝试使用Promise又陷入了作用域混乱。
解决方案
我通过Promise和then()解决了这个问题,以下是修改后的代码:
修改后的addUser函数
async function addUser(username,password) { var resp = { openError : "", runError : "", finalizeError : "" } var data = { db : null, statement : null, } var promisedDB = new Promise((resolve,reject)=>{ var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => { if (err) { resp.openError=err.errno reject() } else { data.db=db resolve() } }); }) await promisedDB.then(_=>{ return new Promise((resolve,reject)=>{ var statement=data.db.prepare("INSERT into users(username,password) VALUES(?,?)") statement.run(username,password,(err)=>{ if (err) { resp.runError=err.errno reject(err) } else { data.statement=statement resolve() } }) }) }).then(_=> { return new Promise((resolve,reject)=>{ data.statement.finalize((err)=>{ if(err) { resp.finalizeError=err.errno reject(err) } else { resolve() } }) }) }).then(_=>{ data.db.close() }).catch(err=>{ console.log(err) }) return resp }
对应的服务器响应代码
app.post('/addUser',jsonParser,(req,res)=>{ addUser(req.body.username,req.body.password).then((value)=>{ console.log(value) res.status(200).send(JSON.stringify(value)) }) });
关键注意点
测试发现,addUser中必须使用data{}这类对象,才能实现跨代码流程修改变量(类似其他语言的引用传递)。
内容的提问来源于stack exchange,提问作者jayqui-grisli
相关产品推荐
相关产品推荐

