无法从浏览器调用电子邮件验证链接?

时间:2019-06-06 16:59:43

标签: node.js express

问题:

我已经在注册用户时创建了电子邮件验证功能。我使用这样的哈希码将链接发送到后端方法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

有人可以帮助我解决此问题吗?我做了很多尝试,找到了解决此问题的方法,但我无法做到。谢谢。

2 个答案:

答案 0 :(得分:1)

问题出在http请求方法和您的路由路径中。我是什么意思?

  1. 例如,当单击此链接http://localhost:3000/api/user/verify?id=a-users-hash时,您将在Node Server中发送一个GET请求。因此,您必须定义一个GET方法来处理请求。
  2. 在此链接中,idquery 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而不是POST
router.get("/verify/:id", (req, res) => {
  res.redirect("https://www.facebook.com/");
});

当用户单击电子邮件中的链接时(或只要您在浏览器的地址栏中键入任何URL),就会要求浏览器打开该链接。浏览器的默认操作是使用GET方法而不是POST请求链接。

POST仅在您可以定义如何发起HTTP请求时才适用,HTTP请求在浏览器的上下文中是在页面加载后使用javascript还是提交表单并显式指定POST作为方法。