我对将SQLite(但通常是数据库)与Node.js和Express框架集成在一起有疑问。
据我所知,打开和关闭与数据库的连接总是好的。但是在Node.js中,进程是异步的(有时)。
router.get("/", (req, res) => {
let db = new sqlLite.Database(path.resolve("data.db"), (err) => {
if (err) {
console.error(err.message);
}
console.log("Connected to the chinook database.");
});
db.get(`SELECT * FROM data WHERE key = '${req.query.data}'`, (err, row) => {
res.json(row);
});
db.close((err) => {
if (err) {
console.error(err.message);
}
console.log("Close the database connection.");
});
});
在此示例中,我直接在路由内打开和关闭连接,因此它仅在这种情况下处理事件。这种方法正确吗?你有什么建议?
答案 0 :(得分:0)
在大多数情况下,更好的方法是使用某种连接池,但是取决于您的应用程序可能无关紧要。
也就是说,有两件事很重要。首先,您确实需要在回调过程中而不是在查询调用之后关闭连接:
// []
第二个(尽管与您的问题无关)是模板字符串对于SQL注入攻击而言不是安全的。因此,除非您对恶意用户销毁数据库感到满意,否则您实际上不应该从req.body或req.query或类似内容中获取直接用户输入,并将其与查询连接起来。
为避免注入问题,最好既验证用户输入是否在可接受的值范围内,又使用prepared statements适当地逃避潜在的恶意值。