错误:无法在视图目录“ / app / views”中查找视图“登录”

时间:2019-11-12 14:43:29

标签: node.js express heroku handlebars.js

我刚刚使用Express创建了我的第一个node.js应用。我正在使用把手作为视图引擎。

在我的本地计算机上一切正常。但是,一旦将代码推送到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);

enter image description here

更新

这是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)

2 个答案:

答案 0 :(得分:1)

为什么要使用path来设置诸如app.set('views', path.join(__dirname, 'views'))之类的视图的目录路径?如果它确实位于应用程序目录结构的根目录中,则不需要。

我认为您可以完全删除该行。我不确定为什么会在本地运行,但是您获得的所有其他功能都应该正常工作。

编辑

这是我用作您的“测试人员”的代码。此代码在本地和部署到Heroku时均有效。由于它与原始示例代码非常接近,因此不确定是否具有超级启发性。

我还包括了目录结构。

server.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);

my directory structure

答案 1 :(得分:0)

尝试一下:

app.use(express.static(path.join(__dirname, '/public'));

您在公众面前错过了/