提交 68962fd6 作者: SiloQIAN

Initial commit

上级
# Node.js 依赖目录
node_modules/
# 环境变量文件
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# 日志文件
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 运行时文件
pids
*.pid
*.seed
*.pid.lock
# 依赖缓存
.npm
.eslintcache
.node_repl_history
# 编译输出目录
dist/
build/
out/
# IDE 和编辑器文件
.idea/
.vscode/
*.swp
*.swo
.DS_Store
Thumbs.db
# 临时文件
tmp/
temp/
# 持续集成/部署
.nyc_output/
coverage/
# 会话和缓存文件
.cache/
.session
\ No newline at end of file
const express = require('express');
const bodyParser = require('body-parser');
const { Pool } = require('dmdb'); // 达梦数据库驱动
const app = express();
const port = 3000;
// 中间件
app.use(bodyParser.json());
// 达梦数据库连接配置
const pool = new Pool({
host: 'localhost', // 数据库主机地址
port: 5236, // 数据库端口
database: 'DMDB', // 数据库名称
user: 'SYSDBA', // 用户名
password: 'SYSDBA', // 密码
max: 20, // 连接池最大连接数
idleTimeoutMillis: 30000 // 连接最大空闲时间
});
// 健康检查端点
app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok' });
});
// SQL执行端点
app.post('/execute-sql', 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语句'
});
}
// 获取数据库连接
const client = await pool.connect();
try {
// 执行查询
const result = await client.query(sql);
res.status(200).json({
success: true,
rows: result.rows,
rowCount: result.rowCount,
fields: result.fields
});
} 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) => {
console.error('应用错误:', err);
res.status(500).json({
error: '服务器内部错误',
message: err.message
});
});
// 启动服务器
app.listen(port, () => {
console.log(`服务已启动,监听端口: ${port}`);
});
// 优雅关闭
process.on('SIGINT', async () => {
console.log('正在关闭应用...');
try {
await pool.end();
console.log('数据库连接池已关闭');
process.exit(0);
} catch (err) {
console.error('关闭数据库连接池时出错:', err);
process.exit(1);
}
});
module.exports = app;
\ No newline at end of file
{
"name": "dm8-connect",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "silo",
"license": "ISC",
"description": ""
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论