You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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包简化配置,更可靠:

  1. 安装依赖:npm install cors
  2. 修改配置代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:42:21