提交 f45a6ddc 作者: SiloQIAN

refactor: 移除达梦数据库连接相关代码,添加路由模块,更新依赖项

上级 47688e81
const express = require('express'); const express = require('express');
var createError = require('http-errors');
const bodyParser = require('body-parser'); const bodyParser = require('body-parser');
const dmdb = require('dmdb'); // 达梦数据库驱动
// 设置返回结果格式为对象
// https://eco.dameng.com/document/dm/zh-cn/pm/nodejs-rogramming-guide.html#10.3.1.2%20%E5%B1%9E%E6%80%A7
dmdb.outFormat = dmdb.OUT_FORMAT_OBJECT;
const app = express(); const app = express();
const port = 8829; const port = 8829;
...@@ -36,94 +30,13 @@ app.use((err, req, res, next) => { ...@@ -36,94 +30,13 @@ app.use((err, req, res, next) => {
next(err); // 传递其他错误 next(err); // 传递其他错误
}); });
const dmHost = '10.51.210.4';
const dmPort = 5237;
const dmDatabase = 'ZZ_ZWBH_PLANT_PROTECTION';
const dmUser = 'ZZ_ZWBH_PLANT_PROTECTION';
const dmPassword = 'Pp20210721';
const accessToken = 'ZZ_ZWBH_PLANT_PROTECTION';
const connectString = `dm://${dmUser}:${dmPassword}@${dmHost}:${dmPort}?autoCommit=false&loginEncrypt=false`;
//获取数据库连接
async function getConnection() {
try {
return await dmdb.getConnection(connectString);
} catch (err) {
throw new Error("getConnection error: " + err.message);
}
}
getConnection().then(client => {
client.execute('SELECT 1');
console.log('数据库连接成功');
client.release();
}).catch(err => {
console.error('数据库连接失败:', err);
process.exit(1);
});
// 健康检查端点 // 健康检查端点
app.get('/health', (req, res) => { app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok' }); res.status(200).json({ status: 'ok' });
}); });
// SQL执行端点 // SQL执行端点
app.post('/execute-sql', app.use('/', require('./routes/index'));
(req, res, next) => {
// Bearer Token验证
const token = req.headers['authorization'];
if (!token || token !== `Bearer ${accessToken}`) {
console.error('Token 未授权', token);
return res.status(401).json({ error: '未授权' });
}
next();
},
async (req, res) => {
const { sql } = req.body;
if (!sql) {
return res.status(400).json({ error: '缺少SQL查询语句' });
}
try {
// 验证SQL是否为SELECT查询
const normalizedSql = sql.trim().toLowerCase();
if (!normalizedSql.startsWith('select ')) {
return res.status(403).json({
error: '仅允许SELECT查询',
message: '出于安全考虑,只允许执行SELECT语句'
});
}
console.log(`[${new Date().getTime()}] 执行查询:`, sql);
// 获取数据库连接
const client = await getConnection();
try {
// 执行查询
const result = await client.execute(sql);
res.status(200).json({
success: true,
rows: result.rows,
rowCount: result.rowsAffected,
fields: result.name
});
} finally {
// 释放连接回连接池
client.release();
}
} catch (err) {
console.error('查询执行失败:', err);
res.status(500).json({
error: '查询执行失败',
message: err.message,
detail: process.env.NODE_ENV === 'development' ? err.stack : undefined
});
}
});
// 错误处理中间件 // 错误处理中间件
app.use((err, req, res, next) => { app.use((err, req, res, next) => {
......
const accessToken = 'ZZ_ZWBH_PLANT_PROTECTION';
export const auth = (req, res, next) => {
// Bearer Token验证
const token = req.headers['authorization'];
if (!token || token !== `Bearer ${accessToken}`) {
console.error('Token 未授权', token);
return res.status(401).json({ error: '未授权' });
}
next();
};
...@@ -9,9 +9,11 @@ ...@@ -9,9 +9,11 @@
"license": "ISC", "license": "ISC",
"description": "", "description": "",
"dependencies": { "dependencies": {
"axios": "^1.8.4",
"body-parser": "^1.20.3", "body-parser": "^1.20.3",
"dmdb": "^1.0.33801", "dmdb": "^1.0.33801",
"express": "^4.21.2", "express": "^4.21.2",
"http-errors": "^2.0.0" "http-errors": "^2.0.0",
"mammoth": "^1.9.0"
} }
} }
const express = require('express');
const router = express.Router();
const { auth } = require('../middlewares/auth');
const dmdb = require('dmdb'); // 达梦数据库驱动
// 设置返回结果格式为对象
// https://eco.dameng.com/document/dm/zh-cn/pm/nodejs-rogramming-guide.html#10.3.1.2%20%E5%B1%9E%E6%80%A7
dmdb.outFormat = dmdb.OUT_FORMAT_OBJECT;
const dmHost = '10.51.210.4';
const dmPort = 5237;
const dmDatabase = 'ZZ_ZWBH_PLANT_PROTECTION';
const dmUser = 'ZZ_ZWBH_PLANT_PROTECTION';
const dmPassword = 'Pp20210721';
const connectString = `dm://${dmUser}:${dmPassword}@${dmHost}:${dmPort}?autoCommit=false&loginEncrypt=false`;
//获取数据库连接
async function getConnection() {
try {
return await dmdb.getConnection(connectString);
} catch (err) {
throw new Error("getConnection error: " + err.message);
}
}
getConnection().then(client => {
client.execute('SELECT 1');
console.log('数据库连接成功');
client.release();
}).catch(err => {
console.error('数据库连接失败:', err);
process.exit(1);
});
router.post('/', auth, async (req, res) => {
const { sql } = req.body;
if (!sql) {
return res.status(400).json({ error: '缺少SQL查询语句' });
}
try {
// 验证SQL是否为SELECT查询
const normalizedSql = sql.trim().toLowerCase();
if (!normalizedSql.startsWith('select ')) {
return res.status(403).json({
error: '仅允许SELECT查询',
message: '出于安全考虑,只允许执行SELECT语句'
});
}
console.log(`[${new Date().getTime()}] 执行查询:`, sql);
// 获取数据库连接
const client = await getConnection();
try {
// 执行查询
const result = await client.execute(sql);
res.status(200).json({
success: true,
rows: result.rows,
rowCount: result.rowsAffected,
fields: result.name
});
} finally {
// 释放连接回连接池
client.release();
}
} catch (err) {
console.error('查询执行失败:', err);
res.status(500).json({
error: '查询执行失败',
message: err.message,
detail: process.env.NODE_ENV === 'development' ? err.stack : undefined
});
}
});
module.exports = router;
const express = require('express');
const router = express.Router();
router.use('/execute-sql', require('./execute-sql'));
router.use('/trans-doc', require('./trans-doc'));
module.exports = router;
const express = require('express');
const router = express.Router();
const axios = require('axios');
const mammoth = require('mammoth');
/**
* 依据传递过来的 docx 文件的 url ,将 docx 的内容转换为 string 返回
* 1. 下载 docx 文件
* 2. 将 docx 文件转换为 string
* 3. 返回 string
*
* * 使用 `axios` 库来下载 docx 文件 @https://www.npmjs.com/package/axios
* * 使用 `mammoth` 库来将 docx 文件转换为 string @https://www.npmjs.com/package/mammoth
*/
router.post('/docx2text', async (req, res) => {
try {
const { url } = req.body;
if (!url) {
return res.status(400).json({ error: 'URL is required' });
}
// 下载 docx 文件
const response = await axios({
method: 'get',
url: url,
responseType: 'arraybuffer'
});
console.info('extractRawText url: ', url);
// 使用 mammoth 转换文档内容
const result = await mammoth.extractRawText({ buffer: response.data });
// 返回转换后的文本
res.json({ text: result.value });
} catch (error) {
console.error('Error processing docx file:', error);
res.status(500).json({ error: 'Failed to process docx file' });
}
});
module.exports = router;
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论