【问题标题】:Nodejs Express Server Doesn't Respond to HTTP POST: OpenShiftNodejs Express 服务器不响应 HTTP POST:OpenShift
【发布时间】:2015-08-17 11:24:43
【问题描述】:

对于我使用 Node 的第一次体验,我在 Openshift 上托管了一个 Nodejs 服务器,我希望很快将其用于 Android 应用程序服务器。目前,我正在尝试获取一个简单的快速应用程序来响应 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()));
});

这是我用来测试响应的 Node 脚本。我不认为这是问题所在,因为我也尝试过使用 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 也无法解决问题。不过,我假设这是端口的问题,因为当我尝试发送请求时,我的发布脚本和浏览器都挂了,而不是引发连接错误。诚然,我是一个完全的菜鸟,我很容易忽略一个简单但关键的元素。提前致谢。

【问题讨论】:

  • 我已经测试了你的代码,如果你把 localhost 和一些端口放在它工作正常,所以我猜你在配置时遇到了问题?
  • 对我来说使用 localhost 也能正常工作。当我尝试 POST 到托管在 OpenShift 上的服务器时,会出现问题。

标签: node.js express openshift


【解决方案1】:

这可能与我对 Web 技术的一般经验不足有关,但我发现了问题;尝试 POST 到特定端口时,服务器无响应。但是,如果我从我的 POSTing 脚本中完全删除端口声明,那么它可以正常工作。有人可以解释为什么会这样吗?

【讨论】:

  • 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.js,还有一个问题。我使用 OpenShift 提供的免费软件包托管此服务器,它允许 3 个 Web 应用程序无需付费。为了提高性能,我想我会有多个服务器专门用于一项任务,例如登录、发送消息和发送通知。我是否需要创建单独的 HTTP 服务器来促进这一点?如果是这样,每个都算作一个单独的网络应用程序吗?
  • 这不适用于 OpenShift。除非您预计会有大量流量,否则这也可能是矫枉过正。在 OpenShift 上,您可以通过在多个服务器上运行相同的代码来扩展您的应用程序。要在不同的服务器上运行不同的代码,您需要在 OpenShift 上创建全新的应用程序,但它们不会共享数据库。听起来您只需要在应用程序中为每个任务创建单独的页面或端点。然后,如果您需要更好的性能,您可以将负载分布在多个服务器上。
【解决方案2】:

我的答案可能会迟到,但是在这里解决了同样的问题,也许这会对其他人有所帮助。

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

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

它没有响应。

-> rhcloud.com 有自己的内部路由,所以 process.env.OPENSHIFT_NODEJS_* 在他们自己的服务器之外不会有帮助。您的 NodeJS 应用绑定到一个内部 ip 和端口,但该 ip 不是公开的。

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

只需在您的 URI 中添加 https 端口:

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

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 2018-02-19
    • 2016-04-12
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-04-14
    相关资源
    最近更新 更多