为什么 EC2/Node.js GET 请求有效但 POST 甚至没有被路由?
Why do EC2/Node.js GET requests work but POST aren’t even routed?
我的问题的变体已被问过数十次,但我尝试过的都没有奏效。
我的 Node.js API 在本地主机上按预期工作 GET
和 POST
请求。
在我的 EC2/nginx 实例上,服务器块已正确配置并通过 https 提供静态索引。
然后我将此服务器块配置为我的 API 端口 (8000) 的代理,并且 return API 正在侦听。
然后我 运行 一个简单的 GET
/index 端点被路由并正常工作。
但是,此处类似的 POST
/checkEmail 端点(请记住,它在本地主机上工作)超时并出现 504 错误。这就是奇怪的地方。
它甚至不会 console.log 有效载荷,函数的第一行。这意味着它甚至没有正确路由。这是我的路线:
const API = require("./controllers/api");
module.exports = [
{ method: 'POST', path: '/checkEmail', options: API.checkEmail },
{ method: 'POST', path: '/sendEmail', options: API.sendEmail },
{ method: 'POST', path: '/recaptcha', options: API.recaptcha },
{ method: 'GET', path: '/index', options: API.index }
]
既然 GET 请求 return 是预期的响应,那么这意味着所有这些都是真的:
- 防火墙规则允许流量通过 443 (HTTPS) 端口
- 该流量通过 8000 (API) 端口代理
- 服务器块正在正确提供文件
- ssl 证书有效
- 请求发送到上游服务器
端点:
const axios = require("axios");
const env = require("dotenv").config();
const AWS = require("aws-sdk");
const subscriber = require("./middleware/subscriber");
const sanitizer = require("./middleware/sanitizer");
exports.index = {
cors: {
origin: ["*"]
},
handler: (request, h) => {
return "API Fluente";
}
}
exports.checkEmail = {
cors: {
origin: ["*"]
},
handler: async (request, h) => {
// This is never logged:
console.log(request.payload);
const payload = request.payload;
const email = await sanitizer.email(payload.email);
if(!email) throw new Error("Invalid email");
const response = await verifyEmail(email);
console.log("checkEmail attempt:", email, response.data)
if (response.status === 200) {
return h.response(response.data).code(200);
}
}
}
我尝试过的:
- Minimal/Full 服务器块 conf 设置
curl
来自 EC2 CLI 的 POST
请求
- 将端口从 8000 更改为其他端口(例如 8003)
- 增加超时持续时间没有意义,因为这些都是简单的请求,应该 return 在很短的时间内得到响应。
None 这些有什么不同。
找到问题了!事实证明,它与 AWS 服务或 Node 无关。
当我应该使用 @hapi/hapi.
时,我使用了已弃用的 hapi 包
我的问题的变体已被问过数十次,但我尝试过的都没有奏效。
我的 Node.js API 在本地主机上按预期工作 GET
和 POST
请求。
在我的 EC2/nginx 实例上,服务器块已正确配置并通过 https 提供静态索引。
然后我将此服务器块配置为我的 API 端口 (8000) 的代理,并且 return API 正在侦听。
然后我 运行 一个简单的 GET
/index 端点被路由并正常工作。
但是,此处类似的 POST
/checkEmail 端点(请记住,它在本地主机上工作)超时并出现 504 错误。这就是奇怪的地方。
它甚至不会 console.log 有效载荷,函数的第一行。这意味着它甚至没有正确路由。这是我的路线:
const API = require("./controllers/api");
module.exports = [
{ method: 'POST', path: '/checkEmail', options: API.checkEmail },
{ method: 'POST', path: '/sendEmail', options: API.sendEmail },
{ method: 'POST', path: '/recaptcha', options: API.recaptcha },
{ method: 'GET', path: '/index', options: API.index }
]
既然 GET 请求 return 是预期的响应,那么这意味着所有这些都是真的:
- 防火墙规则允许流量通过 443 (HTTPS) 端口
- 该流量通过 8000 (API) 端口代理
- 服务器块正在正确提供文件
- ssl 证书有效
- 请求发送到上游服务器
端点:
const axios = require("axios");
const env = require("dotenv").config();
const AWS = require("aws-sdk");
const subscriber = require("./middleware/subscriber");
const sanitizer = require("./middleware/sanitizer");
exports.index = {
cors: {
origin: ["*"]
},
handler: (request, h) => {
return "API Fluente";
}
}
exports.checkEmail = {
cors: {
origin: ["*"]
},
handler: async (request, h) => {
// This is never logged:
console.log(request.payload);
const payload = request.payload;
const email = await sanitizer.email(payload.email);
if(!email) throw new Error("Invalid email");
const response = await verifyEmail(email);
console.log("checkEmail attempt:", email, response.data)
if (response.status === 200) {
return h.response(response.data).code(200);
}
}
}
我尝试过的:
- Minimal/Full 服务器块 conf 设置
curl
来自 EC2 CLI 的POST
请求- 将端口从 8000 更改为其他端口(例如 8003)
- 增加超时持续时间没有意义,因为这些都是简单的请求,应该 return 在很短的时间内得到响应。
None 这些有什么不同。
找到问题了!事实证明,它与 AWS 服务或 Node 无关。
当我应该使用 @hapi/hapi.
时,我使用了已弃用的 hapi 包