我正在使用Electron应用程序中的节点mssql package与SQL Server连接。
我无法创建REST API。
尽管我有担心,它仍然可以正常工作
可以吗?
工作原理:
app.js
进行2次查询并记录结果
sql.js
与数据库连接
// app.js
const { getUser, getUsers } = require('./sql');
getUser(10).then((result) => {
console.dir(result);
});
getUsers.then((result) => {
console.dir(result);
})
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
// Creates new connection pool for each query
function connectDB() {
const pool = new sql.ConnectionPool(config);
return pool.connect()
.then(pool => {
console.log('Connected to database');
// returns Promise
return pool;
})
.catch(err => console.log('Database connection failed!', err));
}
// 1st query
function getUser(id) {
const connection = connectDB();
return connection
.then(pool => {
return pool.request()
.input('PK_ID', sql.Int, parseInt(id))
.execute('[uspGetUser]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.log('Query failed!', err);
});
}
// 2nd query
function getUsers() {
const DB = connectDB();
return DB
.then(pool => {
return pool.request()
.execute('[uspGetUsers]');
})
.then(result => {
return result.recordset[0];
})
.catch(err => {
console.log('Query failed!', err);
});
}
module.exports = {
getUser,
getUsers
}
答案 0 :(得分:1)
否,您不需要在每次查询后close
也release
个连接返回到连接池。图书馆已经为您做到了。
pool.close()
方法将关闭池中的所有连接。从技术上讲,仅应在终止应用程序时执行此操作,而不要在每次查询后执行此操作,因为每次创建新池都会给应用程序造成相当大的开销。
我自己也有同样的问题,所以我查找了项目的source code。
答案 1 :(得分:0)
解决了!
要关闭数据库连接并返回结果,我们可以使用 finally 语句和 asnyc / await 函数。
最终语句使您可以在尝试捕获后执行代码,而不管结果如何。
// sql.js
const sql = require("mssql");
// DB credentials
const config = {
user: 'myuser',
password: '123',
server: 'myserver',
database: 'mydb',
options: {
encrypt: true
}
}
async function connectDB() {
const pool = new sql.ConnectionPool(config);
try {
await pool.connect();
console.log('Connected to database');
return pool;
}
catch(err) {
console.log('Database connection failed!', err);
return err;
}
}
async function getAll() {
const DB = await connectDB();
try {
const result = await DB.request()
.query('select * from [your_table]');
return result.recordset;
}
catch (err) {
console.log('Error querying database', err);
return err;
}
finally {
DB.close();
}
}
async function execute() {
let result = await getAll();
console.dir(JSON.stringify(result));
return result;
}
execute();