首页 > 解决方案 > 错误:无法在视图目录“/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)

标签: node.jsexpressherokuhandlebars.js

解决方案


为什么要使用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);

我的目录结构


推荐阅读