ai-要約を取得 文章摘要

1. 方案构思

其实,仅仅是中转服务,也可以考虑在原有api的主文件中增加中转逻辑,尤其是原有api与中转逻辑存在管理的情景

2.可行性分析&方案实施

完全可以在原有 API 的主文件中直接增加中转逻辑,尤其是当你的原有 API 和中转逻辑存在相互管理和协调的情景时,这样的设计方式会更加简洁且易于维护。

✅ 在原有 API 中增加中转逻辑的优势:

  1. 集中管理:所有的服务逻辑都集中在一个地方,便于管理和调试。
  2. 减少复杂性:不需要单独启动一个额外的中转服务,避免了服务间的协调和多端口监听的复杂性。
  3. 共享资源:可以直接共享原有 API 的资源、认证逻辑和中间件,避免重复的代码。
  4. 高效的开发和部署:如果你已经有一个稳定的 API 服务,直接在其基础上增加中转逻辑可以加快开发进度,并且减少部署过程中的中转和负载均衡等问题。

✅ 设计思路:

  1. 在原有 API 中实现中转逻辑:你可以通过在现有 API 中增加一个新的路由,处理那些需要代理的请求。这个新路由会接收到来自前端的请求,执行相应的处理后,将其转发到真实的 API 服务。
  2. 与现有逻辑结合:你可以将中转服务与现有的 API 控制器或服务层进行集成,共享已有的验证、授权等逻辑。

原有app.js主文件:

// 在文件顶部引入 dotenv,加载环境变量
require('dotenv').config();

const axios = require('axios');


// 导入 express
const express = require('express')
// 创建 express 实例
const app = express()

// 导入 Joi 模块
const Joi = require('joi')

// 配置 cors 跨域中间件
const cors = require('cors')
app.use(cors())

// 解析 JSON 数据
// 确保后端启用了 app.use(express.json());
// 这样可以避免由于请求格式不一致导致的问题, 例如在 apifox 中(会自动帮我们转换为json格式)发送请求可正常得到响应
// 但是在实际前端项目中由于携带的参数未经json转换,导致后端无法解析参数,从而导致请求失败
app.use(express.json())
// 配置解析表单数据的中间件,仅能解析 application/x-www-form-urlencoded 类型的表单数据
app.use(express.urlencoded({ extended: false }))

// 响应数据的中间件
app.use((req, res, next) => {
res.cc = (err, status = 1) => {
// status 默认值为 1,表示失败的情况
// err 可能是一个 Error 对象,也可能时一个描述错误信息的字符串
res.send({
status,
message: err instanceof Error ? err.message : err
})
}
next()
})

// 一定要在路由之前,应用此中间件
const { expressjwt } = require('express-jwt')

app.use(
expressjwt({
secret: process.env.JWT_SECRET_KEY, // 从环境变量中读取密钥, // 与生成 Token 时的密钥保持一致
algorithms: ['HS256'], // 确保算法与 Token 的签名方式匹配
getToken: (req) => {
// 从 x-access-token 提取 Token
const token = req.headers['x-access-token']
if (token && token.startsWith('Bearer ')) {
return token.slice(7) // 去掉 "Bearer " 前缀
}
return null
}
}).unless({
path: [/^\/api\/login(\/.*)?$/, /^\/proxy(\/.*)?$/] // 允许 /proxy 路径不进行认证 // 豁免登录相关接口
})
)

// 导入并使用用户路由模块
const userRouter = require('./router/user')
// /api 是一个统一的接口路径前缀
app.use('/api', userRouter)

// 任务列表路由模块
const taskRouter = require('./router/task')
app.use('/api', taskRouter)

// 定义错误级别中间件
// 这里必须要有 next()
app.use((err, req, res, next) => {
// 数据验证失败
if (err instanceof Joi.ValidationError) return res.cc(err)
// 身份认证失败
if (err.name === 'UnauthorizedError') return res.cc('身份认证失败!')
// 未知错误
res.cc(err)
console.error(err)
next()
})

// 启动服务器
app.listen(3007, () => {
console.log('服务器启动成功: http://127.0.0.1:3007')
})

其中,增加以下中转逻辑

// 中转所有 /proxy 开头的请求
app.use('/proxy', async (req, res) => {
const targetUrl = 'https://imooc.zcwytd.com' + req.originalUrl.replace(/^\/proxy/, '')
try {
const response = await axios({
method: req.method,
url: targetUrl,
headers: {
...req.headers,
host: 'imooc.zcwytd.com'
},
data: req.body // 支持 POST/PUT 等请求体
})
res.status(response.status).send(response.data)
} catch (err) {
console.error('代理请求出错:', err.message)
res.status(err.response?.status || 500).send({
error: err.message,
details: err.response?.data || '无法获取更多信息'
})
}
})

3.重新拉取

/var/www/shuangzhao-api-project 目录下,如果要确认本地 Git 分支,可以直接运行:

git branch  #确认本地分支
git branch -a #同时看到本地分支和远程分支

git pull #从远程拉取最新代码

然后,执行 npm -i,执行安装!

为了确保正常通信 - 需要建立密钥关系

运行以下命令:

ssh-keygen -t ed25519 -C "youruilin@gmail.com"

系统会提示你输入文件保存路径。默认是 /root/.ssh/id_rsa,如果你不想改变路径,直接按 回车 就行。如果你想自定义路径,可以输入新的文件路径。

Enter file in which to save the key (/root/.ssh/id_rsa): [直接按回车或输入路径]

完成密钥生成后,你可以查看生成的公钥(id_rsa.pub),并将其添加到 GitHub:

cat ~/.ssh/id_rsa.pub

接下来,需要将复制的内容添加至 github:

  • 登录到你的 GitHub 账户,进入 Settings -> SSH and GPG keys -> New SSH key,然后粘贴你刚刚复制的公钥,保存即可。

  • 公钥添加到 GitHub 后,可以通过以下命令测试 SSH 连接:

    ssh -T git@github.com
关于node环境确实

Node.js 和 npm 的安装通常会绑定到特定用户的环境中,而当使用 root 用户时,可能无法访问普通用户的配置或安装的工具。因此,解决方法主要是确保你在正确的用户环境下执行命令。

4. 修改nginx规则

# 编辑配置文件
sudo nano /etc/nginx/sites-available/default

增加 proxy 字段

# 反向代理本地 API 服务
location /api/ {
proxy_pass http://127.0.0.1:3007; # 不加路径,完整转发 /api/**
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 转发代理第三方 API(Node 中转)
location /proxy/ {
proxy_pass http://127.0.0.1:3007; # /proxy/** 会走 Node 中转
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Ctrl + O(字母 O)来保存文件,然后Ctrl+X退出

测试配置

sudo nginx -t

重新加载 nginx

sudo systemctl reload nginx