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
相关产品推荐
相关产品推荐

