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

NodeJS注册页面调用数据库查询函数出现500错误求助

问题:NodeJS注册页面调用数据库查询函数时出现500错误

我正在搭建一个Mockup网站学习NodeJS,想实现登录系统,尝试将注册页面与数据库脚本关联。数据库的SQL查询函数本身可正常运行,但从注册页面脚本调用该函数时,始终出现500错误。怀疑是对NodeJS特性不熟悉,或是脚本导出、路由存在问题,卡壳数日,附上相关代码求解决方向。

注册页面脚本(POST路由调用查询函数部分)

var express = require('express');
var router = express.Router();
var db = require('../public/javascripts/dbController');

router
    .get('/', function(req, res, next) {
        res.render('register.html', {title: 'Register'})
    })
    .post('/', function(req, res, next) {
        register(req.body);
        res.render('register.html', {title: 'Register'})
    })

function register(request)
{
    let username = request.login;
    let password = request.password;

    let sql = "INSERT INTO users (user_username, user_password, user_status) VALUES ('"+username+"','"+password+"', 1);";
    console.log("query");
    //Why is this not working?
    db.query(sql);
}

module.exports = router;

dbController脚本(部分代码)

const sqlite3 = require('sqlite3').verbose();

let db = new sqlite3.Database('./public/database/db.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err && err.code == "SQLITE_CANTOPEN") {
        createDatabase();
        return;
        } else if (err) {
            console.log("Getting error " + err);
            exit(1);
    }
});

//This function is not running when I ask for it in register.js
function query(sql){
  console.log("running query: " + sql)

  db.all(sql, [], (err, rows) => {
    if (err) {
      throw err;
    }
    rows.forEach((row) => {
      console.log(row.name);
    });
  });
}

module.exports = query;

解决方向

  • 导出与调用错误:dbController里直接导出了query函数,而非包含query方法的对象。所以注册脚本里不能用db.query(sql),应该直接调用db(sql)。
  • 未捕获异步异常:db.all的回调里throw err会触发未捕获异常,导致500错误。需要在回调里处理错误,比如打印错误信息并通过路由的next(err)传递错误,或者返回响应给客户端。
  • SQL注入风险:直接拼接用户名和密码到SQL语句中存在严重的SQL注入漏洞,应该使用参数化查询,比如:
    let sql = "INSERT INTO users (user_username, user_password, user_status) VALUES (?, ?, 1);";
    db.run(sql, [username, password], (err) => {
      // 处理错误
    });
    
  • 异步操作未等待:注册路由里调用register(req.body)后直接res.render,但数据库操作是异步的,应该等待操作完成后再响应客户端,避免逻辑混乱。可以把register改成返回Promise,或者传入回调函数:
    // 修改register为带回调的函数
    function register(request, callback) {
      let username = request.login;
      let password = request.password;
      let sql = "INSERT INTO users (user_username, user_password, user_status) VALUES (?, ?, 1);";
      db.run(sql, [username, password], callback);
    }
    
    // 路由里调用
    .post('/', function(req, res, next) {
      register(req.body, (err) => {
        if (err) {
          return next(err); // 传递错误给错误处理中间件
        }
        res.render('register.html', {title: 'Register', message: '注册成功'});
      });
    })
    

内容的提问来源于stack exchange,提问作者Patrick Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:35:18