POST 请求 returns 504 在线但在本地工作
POST Request returns 504 Online but works locally
简介
我的 POST 请求离线工作,即在本地主机上工作,但在部署网站时不起作用。
我正在使用 nextjs、node、nodemailer、axios 和 nginx。我也使用了 fetch 而不是 axios,它给了我同样的问题。
情况
我有一个 handleSubmit 函数,它从联系表中获取一些输入并将其发送到我的 Gmail 帐户:
axios({
method: "POST",
url: "/api/submit",
data: body,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then((response) => {
if (response.data.status === 'success') {
alert("Email sent, awesome!");
} else {
alert("Oops, something went wrong. Try again")
}
})
api/submit.js如下:
import nodemailer from "nodemailer"
var transport = {
service: 'gmail',
host: "smtp.gmail.com",
port: 587,
secure: false,
auth: {
user: process.env.USER,
pass: process.env.PASS
}
}
var transporter = nodemailer.createTransport(transport);
transporter.verify((error, success) => {
if (error) {
console.log("There was an error:" + error);
} else {
console.log("Server is ready to take messages")
}
})
export default async (req, res) => {
switch (req.method) {
case "POST":
var name = req.body.name;
var content = name " text "
var mail = {
from: name,
to: "myemail@gmail.com",
text: content
}
transporter.sendMail(mail, (err, data) => {
if (!err) {
res.json({
status: "success"
})
res.end();
}
})
break
case "GET":
res.status(200).json({name:"John Doe"})
break
default:
res.status(405).end()
break
}
}
当我 运行 npm 运行 dev 或 npm start 时代码在本地工作,它发布到 http://localhost:3000/api/submit 并且我在几秒钟内收到了电子邮件.
但是,当我在 DigitalOcean 上部署网站并点击提交按钮后 60 秒没有任何反应,然后我在 POST 请求中收到状态代码 504。如果我向 api/submit 发送 GET 请求,它会工作并且我看到该请求的 JSON,所以这是 POST 请求的问题。
我的 Nginx 记录如下:
2021/02/27 13:59:35 [error] 95396#95396: *3368 upstream timed out (110: Connection timed out) while reading response header from upstream, client: my.ip, server: website.com, request: "POST /api/submit HTTP/1.1", upstream: "http://127.0.0.1:3000/api/submit", host: "website.com", referrer: "https://website.com/contact"
几天来我一直在尝试调试它,但就是想不通。
有人有什么想法吗?
EDIT 01.03.2021 问题很尴尬地解决了。
原来端口都打开了,telnet 对所有邮件端口和 smtp 主机都有效。
当我硬编码 username/password 例如对于临时邮件用户:“blah@emphemeral.email”,传递:“fakepassword”;电子邮件将在生产中发送。
原来我的 process.env.USER 和 process.env.PASS 在 npm 运行 build,因为我正在克隆我的 GitHub 存储库,它不包含我的 .env 文件。在服务器上创建我的 .env 文件并 运行ning npm 运行 build 代码运行良好。
感谢您的回复,抱歉给您带来麻烦。
我想这不是您的代码的问题,而是部署过程的问题。您是直接请求您的 API 地址还是传递给代理?如果您使用的是代理,则代理可能没有以正确的方式重定向到您的应用程序
我认为,它适用于您的本地计算机,因为本地主机就在那里。但是在服务器端,也许,就不一样了。
您可以通过以下命令在服务器中查看您的主机名
cat /etc/hosts
如果主机名不同,可能您也允许 CORS。检查的好地方是在浏览器中检查(在 google chrome 中,右键单击 -> 检查)
然后检查是否发现任何与从前端访问服务器相关的消息。
请从部署您的应用程序的 Digital Ocean 检查以下主机的端口是否打开。
Host:smtp.gmail.com Port: 587
我怀疑我不是第一个这样做的人,但这很尴尬。
首先,我确认所有端口都已打开,telnet 对所有邮件端口和 smtp 主机都有效。
然后,当我硬编码 username/password 例如对于临时邮件用户:“blah@emphemeral.email”,传递:“fakepassword”;电子邮件将在生产中发送。
然后我意识到我的 process.env.USER 和 process.env.PASS 变量在 npm [=31] 期间没有被 .env 中 process.env.USER/PASS 的真实值替换=] 构建,因为我正在克隆我的 GitHub 存储库,它不包含我的 .env 文件。意思是我试图以用户名 = "process.env.USER" 和密码 = "process.env.PASS".
登录
在服务器上创建我的 .env 文件并 运行ning npm 运行 构建代码后工作正常。
感谢您的回复,抱歉给您带来麻烦。
简介
我的 POST 请求离线工作,即在本地主机上工作,但在部署网站时不起作用。
我正在使用 nextjs、node、nodemailer、axios 和 nginx。我也使用了 fetch 而不是 axios,它给了我同样的问题。
情况
我有一个 handleSubmit 函数,它从联系表中获取一些输入并将其发送到我的 Gmail 帐户:
axios({
method: "POST",
url: "/api/submit",
data: body,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then((response) => {
if (response.data.status === 'success') {
alert("Email sent, awesome!");
} else {
alert("Oops, something went wrong. Try again")
}
})
api/submit.js如下:
import nodemailer from "nodemailer"
var transport = {
service: 'gmail',
host: "smtp.gmail.com",
port: 587,
secure: false,
auth: {
user: process.env.USER,
pass: process.env.PASS
}
}
var transporter = nodemailer.createTransport(transport);
transporter.verify((error, success) => {
if (error) {
console.log("There was an error:" + error);
} else {
console.log("Server is ready to take messages")
}
})
export default async (req, res) => {
switch (req.method) {
case "POST":
var name = req.body.name;
var content = name " text "
var mail = {
from: name,
to: "myemail@gmail.com",
text: content
}
transporter.sendMail(mail, (err, data) => {
if (!err) {
res.json({
status: "success"
})
res.end();
}
})
break
case "GET":
res.status(200).json({name:"John Doe"})
break
default:
res.status(405).end()
break
}
}
当我 运行 npm 运行 dev 或 npm start 时代码在本地工作,它发布到 http://localhost:3000/api/submit 并且我在几秒钟内收到了电子邮件.
但是,当我在 DigitalOcean 上部署网站并点击提交按钮后 60 秒没有任何反应,然后我在 POST 请求中收到状态代码 504。如果我向 api/submit 发送 GET 请求,它会工作并且我看到该请求的 JSON,所以这是 POST 请求的问题。
我的 Nginx 记录如下:
2021/02/27 13:59:35 [error] 95396#95396: *3368 upstream timed out (110: Connection timed out) while reading response header from upstream, client: my.ip, server: website.com, request: "POST /api/submit HTTP/1.1", upstream: "http://127.0.0.1:3000/api/submit", host: "website.com", referrer: "https://website.com/contact"
几天来我一直在尝试调试它,但就是想不通。 有人有什么想法吗?
EDIT 01.03.2021 问题很尴尬地解决了。
原来端口都打开了,telnet 对所有邮件端口和 smtp 主机都有效。
当我硬编码 username/password 例如对于临时邮件用户:“blah@emphemeral.email”,传递:“fakepassword”;电子邮件将在生产中发送。
原来我的 process.env.USER 和 process.env.PASS 在 npm 运行 build,因为我正在克隆我的 GitHub 存储库,它不包含我的 .env 文件。在服务器上创建我的 .env 文件并 运行ning npm 运行 build 代码运行良好。
感谢您的回复,抱歉给您带来麻烦。
我想这不是您的代码的问题,而是部署过程的问题。您是直接请求您的 API 地址还是传递给代理?如果您使用的是代理,则代理可能没有以正确的方式重定向到您的应用程序
我认为,它适用于您的本地计算机,因为本地主机就在那里。但是在服务器端,也许,就不一样了。
您可以通过以下命令在服务器中查看您的主机名
cat /etc/hosts
如果主机名不同,可能您也允许 CORS。检查的好地方是在浏览器中检查(在 google chrome 中,右键单击 -> 检查)
然后检查是否发现任何与从前端访问服务器相关的消息。
请从部署您的应用程序的 Digital Ocean 检查以下主机的端口是否打开。
Host:smtp.gmail.com Port: 587
我怀疑我不是第一个这样做的人,但这很尴尬。
首先,我确认所有端口都已打开,telnet 对所有邮件端口和 smtp 主机都有效。
然后,当我硬编码 username/password 例如对于临时邮件用户:“blah@emphemeral.email”,传递:“fakepassword”;电子邮件将在生产中发送。
然后我意识到我的 process.env.USER 和 process.env.PASS 变量在 npm [=31] 期间没有被 .env 中 process.env.USER/PASS 的真实值替换=] 构建,因为我正在克隆我的 GitHub 存储库,它不包含我的 .env 文件。意思是我试图以用户名 = "process.env.USER" 和密码 = "process.env.PASS".
登录在服务器上创建我的 .env 文件并 运行ning npm 运行 构建代码后工作正常。
感谢您的回复,抱歉给您带来麻烦。