问题:
我已经在注册用户时创建了电子邮件验证功能。我使用这样的哈希码将链接发送到后端方法URL。
let link = `http://localhost:3000/api/user/verify?id=${
user[0].hash
}`;
let info = await smtpTrans.sendMail({
from: '"Welcom" <mysite.lk99@gmail.com>',
to: req.body.email,
subject: "Please confirm your Email account",
html: "Hi!,<br> Please Click on the link to verify your email.<br><a href=" +link +">Click here to verify</a>.<br> Thank you for registering with mysite.lk!.<br> mysite.lk Team"
这是我指向链接的特殊验证方法。
router.post("/verify/:id", (req, res) => {
res.redirect("https://www.facebook.com/");
});
出于测试目的,我只重定向到Facebook。
电子邮件已成功发送,但是当我单击邮件中的链接时。它说
无法获取/ api / user / verify
有人可以帮助我解决此问题吗?我做了很多尝试,找到了解决此问题的方法,但我无法做到。谢谢。
答案 0 :(得分:1)
问题出在http请求方法和您的路由路径中。我是什么意思?
http://localhost:3000/api/user/verify?id=a-users-hash
时,您将在Node Server中发送一个GET
请求。因此,您必须定义一个GET
方法来处理请求。id
是query marameter
。如果要访问id值,则必须使用req.query
对象而不是req.params
。 此处的要点是,处理此请求的路径应为/api/user/verify
或/verify
,具体取决于您定义的中间件。
/verify/:id
将不会捕获您的请求,因为正如我之前所说,id是查询参数。
所以您的方法应该像这样:
router.get("/verify", (req, res) => {
// req.query.id is your id hash.
res.redirect("https://www.facebook.com/");
});
如果您想使用这种router.get("/verify/:id", (req, res)
方法,则您的链接应具有这种http://localhost:3000/api/user/verify/hashId
形式。
答案 1 :(得分:0)
您必须在
中使用GET而不是POSTrouter.get("/verify/:id", (req, res) => {
res.redirect("https://www.facebook.com/");
});
当用户单击电子邮件中的链接时(或只要您在浏览器的地址栏中键入任何URL),就会要求浏览器打开该链接。浏览器的默认操作是使用GET方法而不是POST请求链接。
POST仅在您可以定义如何发起HTTP请求时才适用,HTTP请求在浏览器的上下文中是在页面加载后使用javascript还是提交表单并显式指定POST作为方法。