node.js - 错误:无法在视图目录“/app/views”中查找视图“登录”
问题描述
我刚刚使用 Express 创建了我的第一个 node.js 应用程序。我使用 Handlebars 作为我的视图引擎。
在我的本地机器上一切正常。但是,一旦我将代码推送到 Heroku,就会在 Heoku 日志中收到以下错误。
错误:无法在视图目录“/app/views”中查找视图“登录”
这是我的清单和文件结构的一部分。它失败了res.render("login");
var port = process.env.PORT || 3000;
var express = require("express");
var app = express();
var path = require("path");
var exphbs = require("express-handlebars");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, "public")));
app.engine('.hbs', exphbs({ defaultLayout: 'main', extname: '.hbs' }));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', '.hbs');
app.get("/", function(req, res) {
res.render("login");
});
app.listen(port);
更新
这是 Heroku 的日志
2019-11-12T18:38:42.240873+00:00 heroku[web.1]: State changed from starting to up
2019-11-12T18:38:43.043841+00:00 heroku[router]: at=info method=GET path="/" host=mygalleryassignment.herokuapp.com request_id=66e3bcd7-8fc9-4e4f-aec2-abf6fda00a03 fwd="66.209.62.22" dyno=web.1 connect=4ms service=32ms status=500 bytes=404 protocol=https
2019-11-12T18:38:43.046317+00:00 app[web.1]: Error: Failed to lookup view "login" in views directory "/app/views"
2019-11-12T18:38:43.046480+00:00 app[web.1]: at Function.render (/app/node_modules/express/lib/application.js:580:17)
2019-11-12T18:38:43.046491+00:00 app[web.1]: at ServerResponse.render (/app/node_modules/express/lib/response.js:1012:7)
2019-11-12T18:38:43.046494+00:00 app[web.1]: at /app/server.js:51:7
2019-11-12T18:38:43.046497+00:00 app[web.1]: at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
2019-11-12T18:38:43.046499+00:00 app[web.1]: at next (/app/node_modules/express/lib/router/route.js:137:13)
2019-11-12T18:38:43.046501+00:00 app[web.1]: at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3)
2019-11-12T18:38:43.046503+00:00 app[web.1]: at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
2019-11-12T18:38:43.046506+00:00 app[web.1]: at /app/node_modules/express/lib/router/index.js:281:22
2019-11-12T18:38:43.046508+00:00 app[web.1]: at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12)
2019-11-12T18:38:43.046510+00:00 app[web.1]: at next (/app/node_modules/express/lib/router/index.js:275:10)
解决方案
为什么要使用path
将目录路径设置为以下视图:app.set('views', path.join(__dirname, 'views'))
?如果它确实位于应用程序目录结构的根目录,则不需要它。
我认为您可以完全删除该行。我不知道为什么,在本地它可以工作,但你得到的其他一切看起来应该可以工作。
编辑
这是我用作您的情况的“测试人员”的代码。此代码在本地和部署到 Heroku 时均有效。不确定这是否很有启发性,因为它非常接近原始示例代码。
我还包括了我的目录结构。
服务器.js
var port = process.env.PORT || 3000;
var express = require("express");
var app = express();
var path = require("path");
var exphbs = require("express-handlebars");
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, "public")));
app.engine('.hbs', exphbs({ defaultLayout: 'main', extname: '.hbs' }));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', '.hbs');
app.get("/", function(req, res) {
res.render("login");
});
app.listen(port);
推荐阅读
- latex - Render latex preview of equation like in latex export (with preceeding/trailing newline)
- laravel - How can i upload images without waiting user to upload images Laravel
- javascript - 如何修复:警告:无法对未安装的组件执行 React 状态更新
- python - 如何取消隐藏 Excel 文件中的行和列并将它们连接到 Pandas 数据框中?
- apache-kafka - 会话窗口如何计算差距?
- kubernetes - DockerInDocker:在 docker 镜像构建时 pip install 失败
- mysql - 匹配来自不同表的行 - MySQL
- paypal - 买方直接向卖方付款的市场的 Paypal 结帐
- c - 班次和班次分配给出不同的结果
- kotlin - MockK 验证返回值