我建立了一个简单的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。另外,我在解释事情上也很差劲,但我希望你能理解我的问题。
答案 0 :(得分:0)
我认为这是nginx问题,而不是Node或Postman问题。无论使用哪种HTTP方法(GET
或POST
),对/api/products
的请求都将导致location /api
上的匹配。我认为您需要使用=
修饰符进行完全匹配。
有关匹配的位置块,请参见this Digital Ocean article。
希望有帮助!
答案 1 :(得分:0)
我找到了答案。在邮递员中,我打电话
example.com/api/products
但是正如您在Nginx配置中看到的那样,服务器在HTTPS上侦听。 因此,它可以与HTTPS Postman呼叫一起使用。
https://example.com/api/products