nodejs流式反向代理ollama api示例代码
代码语言:nodejs
所属分类:其他
代码描述:nodejs流式反向代理ollama api示例代码
代码标签: nodejs 流式 反向 代理 ollama api 示例 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
const http = require('http'); const url = require('url'); const fs = require('fs'); const path = require('path'); const { exec, spawn } = require('child_process'); const httpProxy = require('http-proxy'); const os = require('os'); const axios = require('axios'); const { setTimeout } = require('timers'); // 创建一个 Map 来存储正在进行的请求 const activeRequests = new Map(); // 创建反向代理服务器 const proxy = httpProxy.createProxyServer({ ws: true }); // 监听 proxyReq 事件来获取后端请求对象 proxy.on('proxyReq', (proxyReq, req, res) => { //proxyReq.setHeader('Host', 'localhost:11434'); activeRequests.set(req, proxyReq); }); // 监听 proxyRes 事件来清理已完成的请求 proxy.on('proxyRes', (proxyRes, req, res) => { activeRequests.delete(req); }); // 监听错误事件 proxy.on('error', (err, req, res) => { console.error('Proxy error:', err); activeRequests.delete(req); res.writeHead(502, { 'Content-Type': 'text/plain' }); res.end('Proxy Error'); }); // 获取局域网 IP 地址 function getLocalIp() { const interfaces = os.networkInterfaces(); for (const name of Object.keys(interfaces)) { for (const iface of interfaces[name]) { if (iface.family === 'IPv4' && !iface.internal) { return iface.address; } } } return '127.0.0.1'; } function getBodyText(html) { // 使用正则表达式匹配<body>标签内的内容 const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i); if (bodyMatch && bodyMatch[1]) { // 去除HTML标签,只保留文本内容 return bodyMatch[1].replace(/<[^>]+>/g, ''); } return ''; } // 处理 POST 请求的 JSON 数据 function handlePostRequest(req, res) { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { try { const jsonData = JSON.parse(body); const act = jsonData.action; // 使用专门的字段表示操作类型 if (act === "getpagebyurl") { const targetUrl = jsonData.url; if (!targetUrl) { res.writeHead(400, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: 'URL is required' })); return; } console.log(targetUrl); // 使用 axios 抓取目标 URL 的内容,并设置超时时间为 10 秒 axios.get(targetUrl, { timeout: 10000 }) .then(response => { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ content: getBodyText(response.data) })); }) .catch(error => { console.error('Axios error:', error); let errorMessage = 'Failed to fetch URL'.........完整代码请登录后点击上方下载按钮下载查看
网友评论0