Rest Api 路线仅适用于生产中的 GET

Rest Api routes only working for GET in production

我 运行 node.js 休息 api 使用 Express v4。所有路由都通过本地主机调试按预期工作。但在我的服务器上,他们没有。 唯一不同的是,端口侦听是由服务器上的 Phusion Passenger 完成的(我无法更改)。这是我的 app.js:

const express = require('express'),
  bodyParser = require('body-parser'),
  cors = require('cors'),
  helmet = require('helmet'),
  http = require('http');

var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
app.use(helmet());

app.use('/', require('./api/routes'));

var server = http.createServer(app);
var port = 'passenger'; // 3000 on localhost
server.listen(port, function () {
  console.log('listening ' + port);
});

这是我的 routes.js,它适用于本地调试,但不适用于服务器:

var express = require('express');
var router = express.Router();

router.get('/api/test', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('test get works !');
  res.end('test get works!');
});

router.post('/api/test', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('test post works !');
  res.end('test post works!');
});

module.exports = router;

这里是 localhost 的日志(路由成功):

20180107_192254 | /api/test
20180107_192254 | { get: true } 
20180107_192254 | test get works ! 

20180107_192350 | /api/test
20180107_192350 | { post: true }
20180107_192350 | test post works !

同一进程的日志文件,但通过远程服务器完成(我总是被重定向到第一个路由,req.method 总是 GET)。虽然 'req.route.path' 总是好的,但它永远不会进入预期的功能:

20180107_192757 | /api/test
20180107_192757 | { get: true }
20180107_192757 | test get works ! 

20180107_192759 | /api/test
20180107_192759 | { get: true }
20180107_192759 | test get works ! 

你知道我是否需要更新某处(可能是 .htaccess,或在 js 代码中)吗?我在 Phusion 和 Express 文档上都找不到任何内容。

编辑:

我用应用程序直接使用路由替换了快速路由器,但它不起作用。

但我注意到了一些事情:

var express = require('express');
var router = express.Router();

router.get('/api/test', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('test get works !');
  res.end('test get works!');
});

router.post('/api/test', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('test post works !');
  res.end('test post works!');
});

router.get('/api/otherTest', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('other test get works !');
  res.end('other test get works!');
});

module.exports = router;

在这里,我可以走第一条和第三条路线。事实上,所有 GET 路由都有效(而且只有它们有效)。如果我这样做:

var express = require('express');
var router = express.Router();

router.post('/api/test', function (req, res, next) {
  console.log(req.route.path);
  console.log(req.route.methods);
  console.log('test post works !');
  res.end('test post works!');
});

module.exports = router;

我一无所获。

好的。所以我弄清楚了:我的网站正在将所有 http:// 流量重新路由到 https:// 流量,并且所有请求(GET,POST, PUT,...) 通过 http:// 发送以某种方式转换为 GET 请求。

它们都是正确的 https://.

我不知道为什么会这样,但如果您知道,请随时提供有关此问题的更多详细信息!我知道后会更新。