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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:36