【问题标题】:Node.js how to send http response based on SQL query result (handle exceptions inside callback)Node.js 如何根据 SQL 查询结果发送 http 响应(在回调中处理异常)
【发布时间】:2021-06-24 09:10:45
【问题描述】:

我正在尝试在 node.js 中实现 HTTP 服务器。我想做以下事情:

  1. 从客户端应用程序接收注册请求;
  2. 尝试将用户添加到服务器的数据库中;
  3. 通知客户端应用注册是否成功(例如,由于用户名可能重复)。

这是我目前拥有的代码:

request.on('end', () => {
    if (!this.checkLevel())
        return;

    const username = this.json_data.username;
    const full_name = this.json_data.full_name;
    const new_user_lvl = this.json_data.new_user_lvl;

    const oid = this.generateOID(12);

    database.addUser(username, full_name, new_user_lvl); //code below
    database.addValidOID(oid, username);

    const body = oid;
    response.writeHead(200, {
        'Content-Length': Buffer.byteLength(body),
        'Content-Type': 'text/plain'
    });
    response.end(body);
});


//database.addUser
function addUser(username, full_name, clearance_lvl)
{
    const db = new sqlite3.Database(DB_PATH + DB_NAME);

    const stmt = db.prepare("INSERT INTO User(username, full_name, clearance_lvl) VALUES (?,?,?)");
    stmt.run(username, full_name, clearance_lvl, function (err){
        if (err) throw err;
        console.log(`[Database] Added New User (${username})`);
    });
    stmt.finalize();

    db.close();
}

鉴于当前的代码,我不知道如何捕捉addUser 生成的异常以相应地创建我的http 响应。我已经尝试用try/catch 块包围addUser,但没有效果。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: javascript node.js database sqlite http


    【解决方案1】:

    同时我找到了this question 并改变了我使用 Promise 的方法。

    这是工作代码:

    function SQLRunPromise(connect, stmt, params) 
    {
        return new Promise(function(resolve, reject) {
            connect.run(stmt, params, function cb(err) {
                if(err) {
                    let responseObj = {
                        'error': err
                    }
                    reject(responseObj);
                } else {
                    let responseObj = {
                        'statement': this
                    }
                    resolve(responseObj);
                }
            });
        });
    }
    
    //database.addUser
    async function addUser(username, full_name, clearance_lvl)
    {
        const db = new sqlite3.Database(DB_PATH + DB_NAME);
    
        const stmt = "INSERT INTO User(username, full_name, clearance_lvl) VALUES (?,?,?)";
        const params = [username, full_name, clearance_lvl];
        const promise = SQLRunPromise(db, stmt, params);
    
        db.close();
        return promise;
    }
    
    

    【讨论】:

      【解决方案2】:

      尝试添加 addUser 行来尝试 catch 块?

      【讨论】:

      • 那没有效果。我已经试过了。
      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      相关资源
      最近更新 更多