شرح مختصر للتعديلات اللي عملتها
هذا الالتزام موجود في:
90
pages/api/test-connection.ts
Normal file
90
pages/api/test-connection.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||
import { Client as PgClient } from 'pg';
|
||||
import mysql from 'mysql2/promise';
|
||||
import { MongoClient } from 'mongodb';
|
||||
|
||||
/**
|
||||
* Handles testing the connection to a database.
|
||||
* This version uses native Node.js drivers for reliability and security.
|
||||
*/
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
if (req.method !== 'POST') {
|
||||
return res.status(405).json({ message: 'Method Not Allowed' });
|
||||
}
|
||||
|
||||
const {
|
||||
dbType,
|
||||
dbHost,
|
||||
dbPort,
|
||||
dbUser,
|
||||
dbPassword,
|
||||
dbName,
|
||||
dbRequireSsl
|
||||
} = req.body;
|
||||
|
||||
if (!dbType || !dbHost || !dbPort || !dbUser) {
|
||||
return res.status(400).json({ error: 'Missing required database credentials for testing.' });
|
||||
}
|
||||
|
||||
switch (dbType) {
|
||||
case 'postgresql':
|
||||
const pgClient = new PgClient({
|
||||
host: dbHost,
|
||||
port: Number(dbPort),
|
||||
user: dbUser,
|
||||
password: dbPassword,
|
||||
database: dbName,
|
||||
ssl: dbRequireSsl ? { rejectUnauthorized: false } : false,
|
||||
// ✅ **التعديل: زيادة مهلة الاتصال إلى 30 ثانية**
|
||||
connectionTimeoutMillis: 30000,
|
||||
});
|
||||
|
||||
try {
|
||||
await pgClient.connect();
|
||||
await pgClient.end();
|
||||
return res.status(200).json({ message: 'PostgreSQL connection successful!' });
|
||||
} catch (error: any) {
|
||||
return res.status(500).json({ error: error.message });
|
||||
}
|
||||
|
||||
case 'mysql':
|
||||
let mysqlConnection;
|
||||
try {
|
||||
mysqlConnection = await mysql.createConnection({
|
||||
host: dbHost,
|
||||
port: Number(dbPort),
|
||||
user: dbUser,
|
||||
password: dbPassword,
|
||||
database: dbName,
|
||||
ssl: dbRequireSsl ? { rejectUnauthorized: false } : undefined,
|
||||
connectTimeout: 30000, // 30 second timeout
|
||||
});
|
||||
await mysqlConnection.end();
|
||||
return res.status(200).json({ message: 'MySQL connection successful!' });
|
||||
} catch (error: any) {
|
||||
// Ensure connection is closed even if it fails
|
||||
if (mysqlConnection) await mysqlConnection.end();
|
||||
return res.status(500).json({ error: error.message });
|
||||
}
|
||||
|
||||
case 'mongodb':
|
||||
const mongoURI = `mongodb://${dbUser}:${encodeURIComponent(dbPassword || '')}@${dbHost}:${dbPort}/${dbName || ''}?authSource=admin`;
|
||||
const mongoClient = new MongoClient(mongoURI, {
|
||||
ssl: dbRequireSsl,
|
||||
serverSelectionTimeoutMS: 30000, // 30 second timeout
|
||||
});
|
||||
try {
|
||||
await mongoClient.connect();
|
||||
await mongoClient.db("admin").command({ ping: 1 });
|
||||
await mongoClient.close();
|
||||
return res.status(200).json({ message: 'MongoDB connection successful!' });
|
||||
} catch (error: any) {
|
||||
await mongoClient.close();
|
||||
return res.status(500).json({ error: error.message });
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(400).json({ error: 'Unsupported database type' });
|
||||
}
|
||||
}
|
||||
|
المرجع في مشكلة جديدة
حظر مستخدم