Node.js Nodejs Express服务器没有';t响应HTTP POST:OpenShift

Node.js Nodejs Express服务器没有';t响应HTTP POST:OpenShift,node.js,express,openshift,Node.js,Express,Openshift,对于我第一次使用Node的体验,我已经在Openshift上托管了一个Nodejs服务器,我希望很快可以将其用于Android应用服务器。目前,我正在尝试获得一个简单的express应用程序,它将响应HTTP POST请求。这是这个服务器的代码;我已经尽可能地简化了它,它对GET请求的响应很好,但POST回调似乎从未执行过: #!/bin/env node var http = require('http'); var bodyParser = require('body-parser');

对于我第一次使用Node的体验,我已经在Openshift上托管了一个Nodejs服务器,我希望很快可以将其用于Android应用服务器。目前,我正在尝试获得一个简单的express应用程序,它将响应HTTP POST请求。这是这个服务器的代码;我已经尽可能地简化了它,它对GET请求的响应很好,但POST回调似乎从未执行过:

#!/bin/env node
var http = require('http');
var bodyParser = require('body-parser');

var express = require('express');
var app = express();

app.use(bodyParser.urlencoded({ extended: false }));

app.post('/', function (req, res) {

    res.end("Post successful.");
});

app.get('/', function (req, res) {
    res.end("App listening on port: " + process.env.OPENSHIFT_NODEJS_PORT);
});

http.createServer(app).listen(process.env.OPENSHIFT_NODEJS_PORT, 
    process.env.OPENSHIFT_NODEJS_IP, function() {
        console.log("Server started on %s.", Date(Date.now()));
});
下面是我用来测试响应的节点脚本。我不认为这是问题所在,因为我也尝试过用Java发布和使用HTML表单,但这两种方式似乎都不起作用:

var http = require('http');

var data = JSON.stringify({
    'message' : 'hello'
});

var options = {
    host: 'xx-xx.rhcloud.com',
    port: '8080',
    path: '/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': data.length
    }
};

var request = http.request(options, function(res) {

    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('Response: ' + chunk);
    });

    res.on('end', function(err) {
        console.log("Post successful");
    });
});

request.write(data);
request.end();

在本地运行服务器时,我可以执行回调,但前提是在该点硬编码端口和IP。一旦我启动服务器,它就会用端口响应GET请求,我假设端口总是8080,但即使在主机上对端口进行硬编码8080也不能解决问题。尽管如此,我还是认为这是端口的问题,因为当我尝试发送请求时,我的发布脚本和浏览器都挂断了,而不是抛出连接错误。诚然,我是一个彻头彻尾的傻瓜,我很容易忽视一个简单但关键的因素。提前谢谢

这可能说明我总体上对网络技术缺乏经验,但我发现了问题所在;当尝试发送到特定端口时,服务器没有响应。但是,如果我从发布脚本中完全删除了端口声明,那么它将正常工作。有人能解释一下这是为什么吗

我的答案可能会晚到,但在这里解决了同样的问题,也许这会帮助其他人

假设您的应用程序具有以下公共URL:

http://xyz-dercetech.rhcloud.com/api/authenticate
它没有反应

->rhcloud.com有自己的内部路由,因此process.env.OPENSHIFT_NODEJS_*在自己的服务器之外不会有帮助。您的NodeJS应用程序绑定到内部ip和端口,但该ip不是公共的

使用上述公共URI,您将享受GET请求无缝传递的乐趣。但正如你所说,发布将失败

只需在URI中添加https端口:

http://xyz-dercetech.rhcloud.com:443/api/authenticate

我已经测试了你的代码,如果你放了localhost和一些端口,它可以正常工作,所以我猜你在配置它时遇到了问题?我也可以使用localhost。当我试图发送到OpenShift上托管的服务器时,问题就出现了。OpenShift正在端口80(默认HTTP端口)为您的应用程序提供服务。通过从URL中删除端口,实际上就是在URL中指定端口80,这就是它现在工作的原因。您似乎混淆了OpenShift要求应用程序绑定到的内部端口(通常是8080)和实际服务的端口,后者在OpenShift上始终是端口80。这就是为什么浏览器在这种情况下可以工作的原因,但这是否意味着默认情况下所有POST请求都发送到端口80?是的,HTTP默认为端口80。如果不指定端口(无论是GET还是POST请求),它将默认为端口80。同样,HTTPS默认为端口443。如果指定
http://
而不指定端口,它将使用端口80。如果指定
https://
而不指定端口,它将使用端口443。在OpenShift上,HTTP和HTTPS通信都被路由到服务器上的8080端口。@mbaird,如果您熟悉Node,还有一个问题。我使用OpenShift提供的免费软件包托管此服务器,该软件包允许3个web应用程序而无需支付费用。为了提高性能,我想我应该有多台服务器专门用于一项任务,例如登录、发送消息和发送通知。我是否需要创建单独的HTTP服务器来实现这一点?如果是这样的话,那么每一个应用程序都会算作一个单独的web应用程序吗?这在OpenShift上是行不通的。除非你预计会有大量的流量,否则这也可能是过火了。在OpenShift上,您可以通过在多台服务器上运行相同的代码来扩展应用程序。要在不同的服务器上运行不同的代码,您需要在OpenShift上创建全新的应用程序,但它们不会共享数据库。听起来您只需要在应用程序中为每个任务创建单独的页面或端点。然后,如果需要更好的性能,可以将负载分布到多个服务器上。