我想将Node-mssql用作Node JS Express 4
Web应用程序中的MSSQL数据库连接器。路由处理程序逻辑在单独的文件中处理。
如何创建单个/全局连接池,并在处理路由逻辑的多个文件中使用它?我不想在每个路由处理程序功能/文件中建立新的连接池。
自问和回答问题以来已经三年了。从那以后,一些事情发生了变化。这是我今天建议的基于ES6,mssql 4和Express 4的新解决方案。
这里有两个关键要素。
在 server.js
const express = require('express')
// require route handlers.
// they will all include the same connection pool
const set1Router = require('./routes/set1')
const set2Router = require('./routes/set2')
// generic express stuff
const app = express()
// ...
app.use('/set1', set1Router)
app.use('/set2', set2Router)
// No need to connect the pool
// Just start the web server
const server = app.listen(process.env.PORT || 3000, () => {
const host = server.address().address
const port = server.address().port
console.log(`Example app listening at http://${host}:${port}`)
})
在 db.js
const sql = require('mssql')
const config = {/*...*/}
const poolPromise = new sql.ConnectionPool(config)
.connect()
.then(pool => {
console.log('Connected to MSSQL')
return pool
})
.catch(err => console.log('Database Connection Failed! Bad Config: ', err))
module.exports = {
sql, poolPromise
}
在routes/set1.js
和routes/set2.js
const express = require('express')
const router = express.Router()
const { poolPromise } = require('./db')
router.get('/', async (req, res) => {
try {
const pool = await poolPromise
const result = await pool.request()
.input('input_parameter', sql.Int, req.query.input_parameter)
.query('select * from mytable where id = @input_parameter')
res.json(result.recordset)
} catch (err) {
res.status(500)
res.send(err.message)
}
})
module.exports = router
总结一下
由于模块缓存,您将始终获得相同的承诺,并且该承诺将一次又一次地使用其第一次解析的池进行解析。因此,每个路由器文件使用相同的池。
顺便说一句:在快速路线中,有一些更简单的方法可以尝试尝试,而我在此答案中不会涉及。在此处阅读有关内容:https :
//medium.com/@Abazhenov/using-async-await-in-express-with-
node-8-b8af872c0016
旧的解决方案
这是我3年前发布的解决方案,因为我认为我有一个值得分享的答案,而且在其他地方也找不到文档记录的解决方案。同样在node-mssql
的一些问题(#118,#164和#165)中,也讨论了该主题。
在 server.js
var express = require('express');
var sql = require('mssql');
var config = {/*...*/};
//instantiate a connection pool
var cp = new sql.Connection(config); //cp = connection pool
//require route handlers and use the same connection pool everywhere
var set1 = require('./routes/set1')(cp);
var set2 = require('./routes/set2')(cp);
//generic express stuff
var app = express();
//...
app.get('/path1', set1.get);
app.get('/path2', set2.get);
//connect the pool and start the web server when done
cp.connect().then(function() {
console.log('Connection pool open for duty');
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
}).catch(function(err) {
console.error('Error creating connection pool', err);
});
在 routes/set1.js
var sql = require('mssql');
module.exports = function(cp) {
var me = {
get: function(req, res, next) {
var request = new sql.Request(cp);
request.query('select * from test', function(err, recordset) {
if (err) {
console.error(err);
res.status(500).send(err.message);
return;
}
res.status(200).json(recordset);
});
}
};
return me;
};
问题内容: 有没有办法在单个函数调用上做到这一点? 就像是: 我知道这是一个语法混乱,但是只是为了给我一个我想实现的目标一个思路,一系列路由就很棒了! 有人知道怎么做吗? 问题答案: 我在寻找相同功能时遇到了这个问题。 @Jonathan Ong在上面的评论中提到,不建议将数组用于路径,但已在Express 4中对其进行了明确描述,并且它在Express 3.x中有效。这是尝试的示例: 从对象内部
问题内容: 我正在尝试编写一个多线程Python应用程序,其中在线程之间共享一个SQlite连接。我无法使它正常工作。真正的应用程序是一个小巧的Web服务器,但是以下简单代码演示了我的问题。 为了成功运行下面的示例代码,我需要进行哪些更改? 当我在THREAD_COUNT设置为1的情况下运行此程序时,它可以正常工作,并且数据库已按预期进行更新(即,字母“ X”被添加到SectorGroup列的文本
这是否意味着我的整个应用程序只能连接到单个Kafka集群,或者KafkaStreams的每个实例只能连接到单个集群? 我可以创建多个连接到不同集群的具有不同属性的KafkaStreams实例吗?
我的主文件app.js连接到userDB我想添加第二个数据库postsDB 常量mongoose=require(“mongoose”); 常量app=express(); mongoose.set(“UseCreateIndex”,true);mongoose.set(“UseUnifiedTopology”,true); Mongoose.connect(“MongoDB://localhos
我正在制作一个实时多人游戏socket.io和node.js,我有一个html文件,运行一个公共脚本连接到服务器并运行命令,以及定义我需要的库
我不知道如果我每次连接到远程服务器时都创建(新)一个引导程序,是否存在性能问题。所以我想使用一个单独的引导实例连接到多个服务器。我的代码如下: 不幸的是,它与: 至少,我应该使用相同的NioEventLoopGroup,对吗?