我正在创建一个应用程序,该应用程序将通过节点js中的Upp协议进行通信。此外,我正在使用sql服务器作为数据库,因此为了连接此数据库,我正在使用mssql
npm liabrary。基本上我正在做的我有一个单独的 dbcon 模块,如下所示
const sql = require('mssql')
const config = {
user: 'sa',
password: '123',
server: '192.168.1.164', // You can use 'localhost\instance' to connect to named instance
database: 'SBM-EMCURE',
options: {
encrypt: false // Use this if you're on Windows Azure
}
}
sql.connect(config, err => {
})
sql.on('error', err => {
console.log('error on sql.on()');
})
module.exports.sql = sql;
我正在使用这个导出的 sql 对象在 dbcon 模块之外运行我的查询,但它有时会给我不同的行为,例如在 databse 连接之前执行查询,有没有办法对整个应用程序使用单个数据库连接?使用单个数据库连接很有用,否则会减慢我的过程
提前谢谢
你可以:
- 将实例传递到每个路由器中,并在设置它们时在那里使用它
- 将实例设置为
app
对象的属性,并从中间件函数中的req.app.sql
或res.app.sql
访问它 - 将实例设置为全局对象的属性,并从任何位置访问它(通常不是最佳做法(
此外,在您的示例代码中,您通过调用sql.connect()
来启动连接,但您不会在它完成连接时为其提供回调。这会导致它立即导出,并且可能在实际建立连接之前进行查询。这样做:
const util = require('util');
const sql = require('mssql');
const config = {
user: 'sa',
password: '123',
server: '192.168.1.164',
database: 'SBM-EMCURE',
options: {
encrypt: false
}
};
module.exports = util.promisify(sql.connect)(config);
然后,您可以使用以下命令检索实例:
const sql = await require('./database.js');
首先你应该创建文件database.js
:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'root',
password : '',
database : 'event'
});
connection.connect(function(err) {
if (err) throw err;
});
module.exports = connection;
然后,您可以在server.js
或任何其他文件中使用此连接。
var express = require('express');
var app = express();
var dbcon = require('./database');
app.get('/getEvent',function(req,res){
dbcon.query('SELECT * FROM eventinfo',function(err, result) {
if (err) throw err;
});
});
app.listen(3000);
node js require 每次需要时都会返回一个模块的相同实例,来自 [Node.js docs]
"every call to require('foo') will get exactly the same object returned, if it would resolve to the same file."
让我们创建一个名为 dbconn 的数据库包装器文件.js
var mysql = require('mysql');
var connection = mysql.createConnection({
host : '127.0.0.1',
user : 'root',
password : '',
database : 'event'
});
connection.connect(function(err) {
if (err) throw err;
});
module.exports = connection;
在任何文件中,您都可以只要求数据库包装器 js 并获得相同的连接
var dbcon = require('./dbconn');
dbcon.query('SELECT * FROM eventinfo',function(err, result) {
if (err) throw err;
});