Nodejs cordova 远端服务器GET能用 POST不能用

Nodejs cordova 远端服务器GET能用 POST不能用

小弟用cordova+angularjs express+mongo做了个社交app。

开发过程用chrome调试,没问题, localhost能post能get,线上阿里云服务器能POST能GET

用cordova打包成app后,把localhost改成局域网ip,能post能get, 但是把服务器地址改成线上的就只能get不能post,因为验证码,json串这些GET操作都能过,但新用户注册和登录这需要POST的操作就失败,求指点!

(应该不是跨域问题,服务器和客户端都已经有相应的设置了,并且app的ip指向局域网ip的时候GET和POST都是没问题的)


4 回复

Node.js + Cordova 远端服务器 GET 能用 POST 不能用

问题描述

我使用 Cordova + AngularJS 和 Express + MongoDB 开发了一个社交应用。在开发过程中,我在 Chrome 浏览器中进行调试,一切正常,无论是本地主机还是线上阿里云服务器,POST 和 GET 请求都能正常工作。

当我将应用打包成 Cordova 应用,并将服务器地址指向局域网 IP 时,所有的请求(包括 POST 和 GET)都能正常工作。然而,当将服务器地址改为线上服务器时,只有 GET 请求能正常工作,POST 请求却失败了。具体来说,验证码和 JSON 数据的 GET 请求都能通过,但新用户注册和登录所需的 POST 请求却失败了。

可能的原因

  1. 网络配置问题:可能线上服务器的防火墙或安全组规则限制了 POST 请求。
  2. CORS 配置问题:尽管已经在服务器和客户端进行了相应的 CORS 设置,但仍可能存在某些配置不正确的地方。
  3. SSL/TLS 证书问题:如果线上服务器使用了 HTTPS,可能是 SSL/TLS 证书配置问题导致 POST 请求失败。

解决方案

1. 检查网络配置

确保线上服务器允许来自移动设备的 POST 请求。可以通过检查服务器的防火墙规则和安全组设置来确认这一点。

# 示例:检查防火墙规则
sudo iptables -L
2. 确认 CORS 配置

确保 Express 服务器正确配置了 CORS。可以使用 cors 中间件来简化配置。

const express = require('express');
const cors = require('cors');

const app = express();

// 使用 CORS 中间件
app.use(cors({
  origin: 'http://your-cordova-app-url.com', // 允许的来源
  methods: ['GET', 'POST'], // 允许的 HTTP 方法
  allowedHeaders: ['Content-Type', 'Authorization'] // 允许的头部
}));

// 路由定义
app.post('/register', (req, res) => {
  // 处理注册逻辑
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
3. 检查 SSL/TLS 证书

确保线上服务器的 SSL/TLS 证书配置正确。可以通过以下命令检查证书的有效性:

openssl s_client -connect yourserver.com:443

总结

以上步骤可以帮助你排查并解决 Cordova 应用与线上服务器之间 POST 请求失败的问题。希望这些信息对你有所帮助!


明天开android模拟器调试看看吧,这周末不能上线感觉好被催~。~

你好! 现在你这个问题解决了吗?

根据你的描述,问题可能与远端服务器的配置或网络设置有关。以下是一些可能的原因和解决办法:

  1. 网络连接问题

    • 确认你的Cordova应用可以访问线上服务器。尝试在Cordova应用中使用其他网络请求库(如axios)进行测试,看是否可以成功发送POST请求。
    const axios = require('axios');
    axios.post('https://yourserver.com/api/register', {
        username: 'testuser',
        password: 'testpass'
    })
    .then(response => console.log(response))
    .catch(error => console.error(error));
    
  2. SSL证书问题

    • 如果你的线上服务器使用了HTTPS,确保服务器的SSL证书是有效的。Cordova应用可能会因为无效的SSL证书而拒绝发送POST请求。
  3. 服务器端日志

    • 查看服务器端的日志文件,确认POST请求是否到达服务器。如果日志中没有记录,可能是请求被防火墙或其他网络设备阻止了。
  4. CORS 配置

    • 即使你认为这不是跨域问题,也建议再次检查服务器端的CORS配置,确保允许所有必要的HTTP方法(包括POST)。
    app.use((req, res, next) => {
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
        res.header('Access-Control-Allow-Headers', 'Content-Type');
        next();
    });
    
  5. 防火墙/安全组设置

    • 检查阿里云服务器的安全组设置,确保端口(通常是80或443)对公网开放。

通过上述步骤,你应该能够逐步排查并解决问题。如果问题仍然存在,请提供更多的日志信息以便进一步分析。

回到顶部