我刚刚使用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);
更新
这是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)
答案 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);
答案 1 :(得分:0)
尝试一下:
app.use(express.static(path.join(__dirname, '/public'));
您在公众面前错过了/