如何通过Postman连接远程VPS上的Express API?
问题描述
我正尝试通过Postman连接部署在远程VPS上的Express API,但一直没找到明确的操作指南。目前VPS上的Vue前端应用通过Nginx反向代理连接Express,运行完全正常。现在我想把部分Express API开放给非同一服务器的客户端(比如带用户认证的Postman,以JSON格式共享数据)。
补充信息
已确认Express在VPS的3001端口运行,我发送的请求为:
http://vps-url:3001/test
对应Express路由代码:
app.get("/test", (req,res)=>{ res.json({ msg: 'Hello from VPS!' }) })
但Postman请求一直处于挂起状态。我已经配置了CORS白名单,包含本地公网IP等,配置代码如下:
app.use((req, res, next) => { const corsWhitelist = [ 'http://vps-url.com', 'https://anotherclient', '70.80.xxx.xxx' // 我的本地机器公网IP ]; if (corsWhitelist.indexOf(req.headers.origin) !== -1) { res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); } next(); });
解决思路及步骤
1. 优先排查网络连通性
Postman请求挂起最常见的原因是VPS的3001端口未对外开放:
- 登录VPS,检查防火墙规则:
- 若用
ufw,执行:sudo ufw allow 3001/tcp,再执行sudo ufw reload - 若用
firewalld,执行:sudo firewall-cmd --add-port=3001/tcp --permanent,再执行sudo firewall-cmd --reload
- 若用
- 本地用
telnet vps-url 3001或nc -zv vps-url 3001测试端口连通性,连不通的话先解决网络问题。
2. 修正CORS配置漏洞
你的CORS配置存在两个问题:
- Postman直接发请求时可能不带
Origin头,或者带的是chrome-extension://xxx这类不在白名单的值,导致规则不生效 - 非白名单请求直接
next(),缺少明确的CORS响应头,可能引发请求挂起
建议改用官方cors包简化配置,更可靠:
- 安装依赖:
npm install cors - 修改配置代码:
const cors = require('cors'); const corsOptions = { origin: function (origin, callback) { const corsWhitelist = [ 'http://vps-url.com', 'https://anotherclient', '70.80.xxx.xxx' ]; // 允许不带Origin的请求(比如Postman直接发起的请求),同时保留白名单校验 if (!origin || corsWhitelist.indexOf(origin) !== -1) { callback(null, true) } else { callback(new Error('Not allowed by CORS')) } }, allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'] } // 全局应用CORS中间件,也可针对特定路由单独应用 app.use(cors(corsOptions));
3. 检查Express监听地址
如果Express只绑定了localhost(即app.listen(3001, '127.0.0.1')),外部请求无法直接访问3001端口,需修改监听地址为0.0.0.0:
app.listen(3001, '0.0.0.0', () => { console.log('Express running on port 3001, accessible externally'); });
或者在Nginx中新增反向代理规则,通过域名访问API(无需带端口):
server { listen 80; server_name api.vps-url.com; location / { proxy_pass http://localhost:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
之后用http://api.vps-url.com/test发起请求即可。
4. 验证请求是否到达服务端
在Express路由中添加日志输出,确认请求是否真的到达服务端:
app.get("/test", (req,res)=>{ console.log('Test route received request:', req.headers); res.json({ msg: 'Hello from VPS!' }) })
如果VPS上没打印日志,说明请求未到达服务端,回到网络连通性步骤排查。
内容的提问来源于stack exchange,提问作者mikeym
相关产品推荐
相关产品推荐

