proxy.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. var express = require('express');
  2. var router = express.Router();
  3. const fetch = require('node-fetch');
  4. const config = require('../config/app');
  5. // 代理请求的中间件
  6. router.use('/', async (req, res) => {
  7. console.log(`proxy req.url = ${req.url}`);
  8. const targetUrl = `${config.resHost}${req.url}`; // 替换为目标服务器的 URL
  9. console.log(`targetUrl = ${targetUrl}`);
  10. const method = req.method;
  11. const headers = {
  12. ...req.headers,
  13. // 可能需要根据目标服务器的要求调整或添加请求头
  14. };
  15. // 如果请求包含请求体(例如 POST 请求),则读取它
  16. let body;
  17. if (req.method === 'POST' || req.method === 'PUT') {
  18. body = await getRawBody(req); // 使用 getRawBody 函数读取请求体
  19. }
  20. try {
  21. const response = await fetch(targetUrl, {
  22. method,
  23. headers,
  24. body,
  25. });
  26. // 在这里添加 CORS 响应头
  27. res.setHeader('Access-Control-Allow-Origin', '*');
  28. res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  29. res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
  30. // 将目标服务器的响应转发给客户端
  31. const responseData = await response.buffer(); // 获取响应的 Buffer
  32. res.status(response.status).send(responseData);
  33. } catch (error) {
  34. // 处理错误,并将错误信息返回给客户端
  35. console.error('Proxy error:', error);
  36. res.status(500).send('Internal Server Error');
  37. }
  38. });
  39. // 辅助函数:读取请求体的原始数据
  40. async function getRawBody(req) {
  41. return new Promise((resolve, reject) => {
  42. let chunks = [];
  43. req.on('data', (chunk) => {
  44. chunks.push(chunk);
  45. });
  46. req.on('end', () => {
  47. resolve(Buffer.concat(chunks));
  48. });
  49. req.on('error', reject);
  50. });
  51. }
  52. module.exports = router;