【发布时间】:2021-01-13 10:15:57
【问题描述】:
我的 nodejs/express 应用程序中有一个密码重置功能,如果用户忘记了,它会通过 Sendgrid 向用户发送一封电子邮件以输入新密码。
电子邮件包含一个按钮,单击该按钮可打开一个页面,该页面的 url 参数中有一个重置令牌。当我在本地运行应用程序时,此页面通过单击电子邮件按钮正确呈现,但在生产服务器上它返回错误,显然无法找到该页面。
日志如下所示:
ERROR {
2021-01-13T08:23:33.634102+00:00 app[web.1]: view: View {
2021-01-13T08:23:33.634104+00:00 app[web.1]: defaultEngine: 'pug',
2021-01-13T08:23:33.634104+00:00 app[web.1]: ext: '.pug',
2021-01-13T08:23:33.634104+00:00 app[web.1]: name: 'resetpassword',
2021-01-13T08:23:33.634105+00:00 app[web.1]: root: '/app/views',
2021-01-13T08:23:33.634105+00:00 app[web.1]: engine: [Function],
2021-01-13T08:23:33.634106+00:00 app[web.1]: path: undefined
2021-01-13T08:23:33.634106+00:00 app[web.1]: },
2021-01-13T08:23:33.634106+00:00 app[web.1]: statusCode: 500,
2021-01-13T08:23:33.634107+00:00 app[web.1]: status: 'error',
2021-01-13T08:23:33.634108+00:00 app[web.1]: message: 'Failed to lookup view "resetpassword" in views directory "/app/views"'
2021-01-13T08:23:33.634108+00:00 app[web.1]: }
当代码相同时,我不确定它如何在开发中找到 html 模板,但在生产中却找不到。
路线如下:
router.get('/resetPassword/:token', controller.getResetPasswordForm)
exports.getResetPasswordForm = (req, res) => {
res.status(200).render('resetpassword', {
title: 'Reset password',
resetToken: req.params.token
})
}
我唯一能想到的是它与Heroku有关,并且模板相对于根目录,所以也许是“root:'/app/views”。我最近在应用程序中添加了一个新域名(所以它不仅仅是'....herokuapp.com')。
这是相对路径的问题吗?如果 Heroku 在我的开发服务器上工作,它是否有问题?
【问题讨论】:
-
您可以添加路线详细信息以及提供值的路径吗?
-
路径应该只是'.../views/resetPassword.pug'。
-
在我看到您在主应用程序中提供服务的方式之前,我无能为力。如果您可以添加该代码,我可以知道哪里出了问题。
-
对不起,我没有完全关注你 - 我的这个页面的路由只是应用程序的根,它向 url '/resetPassword/:token' 发出 GET 请求,它应该呈现文件在'/theapplication/views/resetPassword.pug'。在本地工作。我会尝试编辑发布代码,但它会有点乱......
-
感觉您当前的工作目录可能没有正确映射。您可以尝试在主 js 文件中设置视图引擎的位置添加
process.cwd() + '/views'吗?