使用Express和SQLite(连接和断开连接)Node.js



我有一个关于SQLite(但通常是DB(与Node.js与and 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.");
});
});

在本例中,我直接在路由中打开和关闭连接,因此它只处理这种情况下的事件。这种方法正确吗?你推荐什么?

在大多数情况下,更好的方法是使用某种连接池,但取决于您的应用程序,这可能很重要,也可能无关紧要。

也就是说,有两件事很重要。首先,您确实需要在回调期间关闭连接,而不是在查询调用之后:

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) => {
db.close((err) => {
if (err) {
console.error(err.message);
}
console.log("Close the database connection.");
});
res.json(row);
});
});

第二,尽管与您的问题无关,但模板字符串对于SQL注入攻击是不安全的。因此,你真的不应该直接从req.body或req.query或类似的地方获取用户输入,并将其与你的查询连接起来,除非你对恶意用户破坏你的数据库感到满意。

为了避免注入问题,最好既验证用户输入是否在可接受的值范围内,又使用准备好的语句来正确地转义潜在的恶意值。

最新更新