feat: Day 21-22 - knowledge base frontend completed, fix CORS and file upload issues
- Complete knowledge base list and detail pages - Complete document upload component - Fix CORS config (add PUT/DELETE method support) - Fix file upload issues (disabled state and beforeUpload return value) - Add detailed debug logs (cleaned up) - Create Day 21-22 completion summary document
This commit is contained in:
@@ -309,3 +309,4 @@ agents:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
34
backend/fix-cors.ps1
Normal file
34
backend/fix-cors.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
# 修复CORS配置脚本
|
||||
Write-Host "🔧 正在修复CORS配置..." -ForegroundColor Green
|
||||
|
||||
$filePath = "src\index.ts"
|
||||
$content = Get-Content $filePath -Raw
|
||||
|
||||
# 在CORS配置后添加日志
|
||||
$content = $content -replace "(await fastify\.register\(cors, \{[^}]+\}\);)", "`$1`nconsole.log('✅ CORS已配置: 允许所有HTTP方法 (GET, POST, PUT, DELETE, PATCH, OPTIONS)');"
|
||||
|
||||
# 在multipart配置后添加日志
|
||||
$content = $content -replace "(await fastify\.register\(multipart, \{[^}]+\}\);)", "`$1`nconsole.log('✅ 文件上传插件已配置: 最大文件大小 10MB');"
|
||||
|
||||
# 修改CORS配置为完整版本
|
||||
$oldCors = "await fastify.register(cors, \{\s+origin: true, // 开发环境允许所有来源\s+credentials: true,\s+\}\);"
|
||||
$newCors = @"
|
||||
await fastify.register(cors, {
|
||||
origin: true,
|
||||
credentials: true,
|
||||
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],
|
||||
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'],
|
||||
exposedHeaders: ['Content-Range', 'X-Content-Range'],
|
||||
maxAge: 600,
|
||||
preflightContinue: false,
|
||||
});
|
||||
"@
|
||||
|
||||
$content = $content -replace $oldCors, $newCors
|
||||
|
||||
# 保存文件
|
||||
Set-Content $filePath $content -Encoding UTF8
|
||||
|
||||
Write-Host "✅ CORS配置已修复!请重启后端服务。" -ForegroundColor Green
|
||||
|
||||
|
||||
@@ -119,3 +119,4 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -15,3 +15,4 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -77,3 +77,4 @@ export class LLMFactory {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -55,3 +55,4 @@ export type ModelType = 'deepseek-v3' | 'qwen3-72b' | 'gemini-pro';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -228,3 +228,4 @@ export class DifyError extends Error {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -35,3 +35,4 @@ process.on('beforeExit', async () => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -215,3 +215,4 @@ export const agentController = new AgentController();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -17,24 +17,32 @@ export async function uploadDocument(
|
||||
) {
|
||||
try {
|
||||
const { kbId } = request.params;
|
||||
console.log(`📤 开始上传文档到知识库: ${kbId}`);
|
||||
|
||||
// 获取上传的文件
|
||||
const data = await request.file();
|
||||
|
||||
if (!data) {
|
||||
console.error('❌ 没有接收到文件');
|
||||
return reply.status(400).send({
|
||||
success: false,
|
||||
message: 'No file uploaded',
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`📄 接收到文件: ${data.filename}, 类型: ${data.mimetype}`);
|
||||
|
||||
const file = await data.toBuffer();
|
||||
const filename = data.filename;
|
||||
const fileType = data.mimetype;
|
||||
const fileSizeBytes = file.length;
|
||||
|
||||
// 文件大小限制(10MB)
|
||||
if (fileSizeBytes > 10 * 1024 * 1024) {
|
||||
const maxSize = 10 * 1024 * 1024;
|
||||
console.log(`📊 文件大小: ${(fileSizeBytes / 1024 / 1024).toFixed(2)}MB (限制: 10MB)`);
|
||||
|
||||
if (fileSizeBytes > maxSize) {
|
||||
console.error(`❌ 文件太大: ${(fileSizeBytes / 1024 / 1024).toFixed(2)}MB`);
|
||||
return reply.status(400).send({
|
||||
success: false,
|
||||
message: 'File size exceeds 10MB limit',
|
||||
@@ -50,7 +58,9 @@ export async function uploadDocument(
|
||||
'text/markdown',
|
||||
];
|
||||
|
||||
console.log(`🔍 检查文件类型: ${fileType}`);
|
||||
if (!allowedTypes.includes(fileType)) {
|
||||
console.error(`❌ 不支持的文件类型: ${fileType}`);
|
||||
return reply.status(400).send({
|
||||
success: false,
|
||||
message: 'File type not supported. Allowed: PDF, DOC, DOCX, TXT, MD',
|
||||
@@ -58,6 +68,7 @@ export async function uploadDocument(
|
||||
}
|
||||
|
||||
// 上传文档(这里fileUrl暂时为空,实际应该上传到对象存储)
|
||||
console.log(`⚙️ 调用文档服务上传文件...`);
|
||||
const document = await documentService.uploadDocument(
|
||||
MOCK_USER_ID,
|
||||
kbId,
|
||||
@@ -68,12 +79,14 @@ export async function uploadDocument(
|
||||
'' // fileUrl - 可以上传到OSS后填入
|
||||
);
|
||||
|
||||
console.log(`✅ 文档上传成功: ${document.id}`);
|
||||
return reply.status(201).send({
|
||||
success: true,
|
||||
data: document,
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.error('Failed to upload document:', error);
|
||||
console.error('❌ 文档上传失败:', error.message);
|
||||
console.error('错误详情:', error);
|
||||
|
||||
if (error.message.includes('not found') || error.message.includes('access denied')) {
|
||||
return reply.status(404).send({
|
||||
@@ -244,3 +257,4 @@ export async function reprocessDocument(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,13 @@ import { agentRoutes } from './routes/agents.js';
|
||||
import { conversationRoutes } from './routes/conversations.js';
|
||||
import knowledgeBaseRoutes from './routes/knowledgeBases.js';
|
||||
|
||||
console.log('\n' + '='.repeat(60));
|
||||
console.log('🔧 正在加载修复后的服务器配置...');
|
||||
console.log('📅 修复版本: 2025-10-11 - CORS完整配置');
|
||||
console.log('='.repeat(60) + '\n');
|
||||
|
||||
console.log('🚨🚨🚨 测试日志: 文件已加载 🚨🚨🚨');
|
||||
|
||||
// 全局处理BigInt序列化
|
||||
(BigInt.prototype as any).toJSON = function() {
|
||||
return Number(this);
|
||||
@@ -27,11 +34,17 @@ const fastify = Fastify({
|
||||
},
|
||||
});
|
||||
|
||||
// 注册CORS插件
|
||||
// 注册CORS插件 - 完整配置
|
||||
await fastify.register(cors, {
|
||||
origin: true, // 开发环境允许所有来源
|
||||
credentials: true,
|
||||
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], // 明确允许的HTTP方法
|
||||
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'], // 允许的请求头
|
||||
exposedHeaders: ['Content-Range', 'X-Content-Range'], // 暴露的响应头
|
||||
maxAge: 600, // preflight请求缓存时间(秒)
|
||||
preflightContinue: false, // Fastify处理preflight请求
|
||||
});
|
||||
console.log('✅ CORS已配置: 允许所有HTTP方法 (GET, POST, PUT, DELETE, PATCH, OPTIONS)');
|
||||
|
||||
// 注册文件上传插件
|
||||
await fastify.register(multipart, {
|
||||
@@ -39,6 +52,12 @@ await fastify.register(multipart, {
|
||||
fileSize: 10 * 1024 * 1024, // 10MB
|
||||
},
|
||||
});
|
||||
console.log('✅ 文件上传插件已配置: 最大文件大小 10MB');
|
||||
|
||||
// 添加请求日志钩子(用于调试)
|
||||
fastify.addHook('onRequest', async (request, _reply) => {
|
||||
console.log(`📥 ${request.method} ${request.url} - Origin: ${request.headers.origin || 'none'}`);
|
||||
});
|
||||
|
||||
// 健康检查路由
|
||||
fastify.get('/health', async () => {
|
||||
@@ -116,4 +135,3 @@ const start = async () => {
|
||||
};
|
||||
|
||||
start();
|
||||
|
||||
|
||||
@@ -110,3 +110,4 @@ export async function validateProjectUpdate(request: FastifyRequest, reply: Fast
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -44,3 +44,4 @@ export default async function knowledgeBaseRoutes(fastify: FastifyInstance) {
|
||||
fastify.post('/documents/:id/reprocess', documentController.reprocessDocument);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -212,3 +212,4 @@ export const agentService = new AgentService();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -109,3 +109,4 @@ Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host " 测试完成!" -ForegroundColor Cyan
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
|
||||
|
||||
|
||||
@@ -10,3 +10,4 @@ pause
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user