POST请求重定向到Nginx代理和NodeJS中的GET

时间:2019-02-22 20:51:56

标签: node.js rest nginx post get

我建立了一个简单的NodeJS应用程序来演示REST API请求处理。 然后,我使用Nginx代理了我的Node应用程序。 然后为了进行测试,我使用Postman进行了GET请求,该请求返回:

"message": "Handling GET request to /products"

这很好。但是将Postman从GET更改为POST,然后发送请求,它将返回相同的答案。

"message": "Handling GET request to /products"

如果我在本地使用curl发出请求(无论是GET还是POST),我都会收到良好的答复。

我使用PM2并运行server.js

server.js:

const http = require('http');
const app = require('./app');
const port = 3000;

const server = http.createServer(app);

server.listen(port);

app.js:

const express = require('express');
const app = express();
const productRoutes = require('./api/routes/products');

app.use('/products', productRoutes);

module.exports = app;

products.js:

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

router.get('/', (req, res, next) => {
    res.status(200).json({
        message: 'Handling GET request to /products'
    });
});

router.post('/', (req, res, next) => {
    res.status(200).json({
    message: 'Handling POST request to /products'
    });
});

module.exports = router;

ngix网站配置

location / {
        try_files $uri $uri/ =404;
}

location /api {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

location /api/products {
    proxy_pass http://localhost:3000/products;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

在我执行Postman POST请求之后,这是Nginx的access.log。未调用GET请求。只是POST,尽管显示了GET请求。

"POST /api/products HTTP/1.1" 301 178 "-" "PostmanRuntime/7.6.0"
"GET /api/products HTTP/1.1" 200 47 "http://flipit.ro/api/products" "PostmanRuntime/7.6.0"

"-"向我显示POST请求没有转发到应该发送的位置。

我是Nginx / NodeJS的新手,所以这可能有一个非常简单和明显的解决方案,但是请不要自欺欺人,因为我已经习惯了Apache / PHP。另外,我在解释事情上也很差劲,但我希望你能理解我的问题。

2 个答案:

答案 0 :(得分:0)

我认为这是nginx问题,而不是Node或Postman问题。无论使用哪种HTTP方法(GETPOST),对/api/products的请求都将导致location /api上的匹配。我认为您需要使用=修饰符进行完全匹配。

有关匹配的位置块,请参见this Digital Ocean article

希望有帮助!

答案 1 :(得分:0)

我找到了答案。在邮递员中,我打电话

example.com/api/products

但是正如您在Nginx配置中看到的那样,服务器在HTTPS上侦听。 因此,它可以与HTTPS Postman呼叫一起使用。

https://example.com/api/products