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