gpt4 book ai didi

node.js - Express.js 与 mssql 高效池管理

转载 作者:行者123 更新时间:2023-12-05 06:52:19 25 4
gpt4 key购买 nike

我是 javascript 世界的新手,我的第一个项目是使用 Express 创建一个高效的 MSSQL rest API。我首先研究了一些基本示例,最后得到了运行良好的示例:

const utils = require('../utils');
const config = require('../../config');
const sql = require('mssql');

const getEvents = async () => {
try {
let pool = await sql.connect(config.sql);
const sqlQueries = await utils.loadSqlQueries('events');
const eventsList = await pool.request().query(sqlQueries.eventslist);
console.log(eventsList);
return eventsList.recordset;

} catch (error) {
console.log(error.message);
}
}
module.exports {getEvents};

我正在使用一个单独的 js 文件来处理我的路由,一个配置文件来处理我的 .env 变量,一个 eventController.js 来处理事件(比如 get 事件),还有一个 utils 文件来处理我的 sql 查询。

索引.js

const express = require('express');
const config = require('./config');
const cors = require('cors');
const bodyParser = require('body-parser');
const eventRoutes = require('./routes/eventRoutes');

const app = express();


app.use(express.json());
app.use(cors());
app.use(bodyParser.json());
app.use('/api', eventRoutes.routes);

app.listen(config.port, () => {
console.log('Server is listening on ' + config.url)
}).on('error', (e) => {
console.log('Error starting the server', e.message)
});

配置.js

const dotenv = require('dotenv');
const assert = require('assert');

dotenv.config();

const { PORT, HOST, HOST_URL, SQL_USER, SQL_PASSWORD, SQL_SERVER, SQL_DATABASE } = process.env;
const sqlEncrypt = process.env.ENCRYPT === true;

assert(PORT, 'PORT is required');
assert(HOST, 'HOST is requred');

module.exports = {
port: PORT,
host: HOST,
url: HOST_URL,
sql: {
server: SQL_SERVER,
database: SQL_DATABASE,
user: SQL_USER,
password: SQL_PASSWORD,
options: {
encrypt: sqlEncrypt,
enableArithAbort: true
},
},
};

路由.js

const express = require('express');
const eventControler = require('../controllers/eventController');
const router = express.Router();

const { getEvents, getEvent, addEvent, updateEvent, deleteEvent } = eventControler;

router.get('/events', getEvents);
router.get('/event/:id', getEvent);
router.post('/event', addEvent);
router.put('event/:id', updateEvent);
router.delete('/event/:id', deleteEvent);

module.exports = {
routes: router
}

eventsController.js

const eventData = require('../data/events');

const getAllEvents = async (req, res, next) => {
try {

const eventlist = await eventData.getEvents();
res.send(eventlist);
} catch (error) {
res.status(400).send(error.message);
}
}
module.exports {getEvents};

我还使用 utils.js 文件将 my.sql 文件转换为 sql 查询,这没什么特别的,我相信你们中的大多数人都知道这个功能被广泛使用。现在,虽然 API 按预期工作,但我想稍微调整连接池管理,以避免服务器为每个用户请求创建新池的情况,也出于调试和状态监控的原因,所以在这里研究了很多问题我决定引入一个名为 client.js 的新文件:

const sql = require("mssql");
const config = require("../config");

const client = new sql.ConnectionPool(config.sql)
.connect()
.then(pool => {
console.log('connected to MSSQL server')
return pool
})
.catch(err => console.log('Database connection failed! Bad config: ', err))


module.exports = {
sql,
client
};

然后我像这样修改了我的 getEvents 函数:

const getEvents = async () => {
try {
const pool = await client;
const sqlQueries = await utils.loadSqlQueries('events');
const list = await pool.request().query(sqlQueries.eventsList);
console.log(list);
return list.recordset;


} catch (error) {
return error.message;
}
}

我收到 200 响应,但正文为空且记录集未定义。我也尝试了这里描述的方法: pool.request is not a function

将我的 client.js 修改为:

const sql = require("mssql");
const config = require("../config");

const client = new sql.ConnectionPool(config.sql);
const poolConnection = client.connect()
.then(pool => {
console.log('connected to MSSQL server')
return pool
})
.catch(err => console.log('Database connection failed! Bad config: ', err))


module.exports = {

poolConnection,
client
};

而且我还将我的 getEvents.js 修改为:

const config = require('../../config');
const sql = require('mssql');
const {poolConnection, client} = require('./client');

const getEvents = async () => {
await poolConnection;
try {

const sqlQueries = await utils.loadSqlQueries('events');
const eventsList = await client.request().query(sqlQueries.eventslist);
console.log(eventsList);
return eventsList.recordset;

} catch (error) {
console.log(error.message);
}
}
module.exports {getEvents};

但我没有得到任何运气。响应仍然是 200,但记录集未定义。我在这里缺少什么?

能否请您指出正确的方向,说明我如何有效地使用全局池而不用新的连接请求淹没 sql server?

最佳答案

粗略地看一下,这似乎是错误的:

const list = await pool.request().query(sqlQueries.eventsList);

await 仅适用于 pool.request()。

应该是:

const request = await pool.request();
const list = await request.query(sqlQueries.eventsList);

这不是我构建生产代码的方式,但我相信这是用您编写的代码解决这个问题的答案。

关于node.js - Express.js 与 mssql 高效池管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65993539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com