Error: Failed to lookup view "index" in views directory "public"
Error: Failed to lookup view "index" in views directory "public"
我有一个简单的 Web 应用程序,当我全新部署它或在本地执行它时,它工作正常。但是,当我终止 pm2 进程并使用
重新启动它时
sudo pm2 start /var/www/thewthr.app/index.js --watch -l /var/log/pm2/thewthr.app.log
结果是:
Error: Failed to lookup view "index" in views directory "public"
at Function.render (/var/www/thewthr.app/node_modules/express/lib/application.js:580:17)
at ServerResponse.render (/var/www/thewthr.app/node_modules/express/lib/response.js:1012:7)
at /var/www/thewthr.app/index.js:35:9
at Layer.handle [as handle_request] (/var/www/thewthr.app/node_modules/express/lib/router/layer.js:95:5)
at next (/var/www/thewthr.app/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/var/www/thewthr.app/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/var/www/thewthr.app/node_modules/express/lib/router/layer.js:95:5)
at /var/www/thewthr.app/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/var/www/thewthr.app/node_modules/express/lib/router/index.js:335:12)
at next (/var/www/thewthr.app/node_modules/express/lib/router/index.js:275:10)
这是我的代码:
const express = require('express');
const path = require('path');
require('dotenv').config({path: path.join(__dirname, '.env')});
const app = express();
const server = require('http').Server(app);
// start server
server.listen(process.env.PORT, () => console.log(`Express running → PORT ${server.address().port}`));
// start rendering engine
app.set('view engine', 'pug');
app.set('views', 'public');
// define express props
app.use(express.static('public'));
app.use(express.urlencoded({extended: true}));
app.use(express.json());
// render view
app.get('/', (req, res) => {
res.render('index', {
title: `weather ☀`
});
});
Express 的视图和静态文件都是相对于当前工作目录的,这不是 javascript 文件的位置,而是您 运行 文件所在的位置。您可以看到带有 process.cwd()
的 cwd 和带有 __dirname
的文件位置,并观察它们有何不同。存在三种可能的修复方法:
将 'public'
的所有实例替换为 __dirname + 'public'
或 path.join(__dirname, 'public')
。这将使用文件的位置而不是 cwd 作为基本目录,这样无论 cwd 如何,您的程序都能正常工作。
在您的程序开始时调用 process.chdir(__dirname)
将当前工作目录更改为文件的位置,这也将确保您的程序在任何情况下都能正确运行cwd.
在 pm2 中用 --cwd /var/www/thewthr.app
启动你的程序。
我有一个简单的 Web 应用程序,当我全新部署它或在本地执行它时,它工作正常。但是,当我终止 pm2 进程并使用
重新启动它时sudo pm2 start /var/www/thewthr.app/index.js --watch -l /var/log/pm2/thewthr.app.log
结果是:
Error: Failed to lookup view "index" in views directory "public"
at Function.render (/var/www/thewthr.app/node_modules/express/lib/application.js:580:17)
at ServerResponse.render (/var/www/thewthr.app/node_modules/express/lib/response.js:1012:7)
at /var/www/thewthr.app/index.js:35:9
at Layer.handle [as handle_request] (/var/www/thewthr.app/node_modules/express/lib/router/layer.js:95:5)
at next (/var/www/thewthr.app/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/var/www/thewthr.app/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/var/www/thewthr.app/node_modules/express/lib/router/layer.js:95:5)
at /var/www/thewthr.app/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/var/www/thewthr.app/node_modules/express/lib/router/index.js:335:12)
at next (/var/www/thewthr.app/node_modules/express/lib/router/index.js:275:10)
这是我的代码:
const express = require('express');
const path = require('path');
require('dotenv').config({path: path.join(__dirname, '.env')});
const app = express();
const server = require('http').Server(app);
// start server
server.listen(process.env.PORT, () => console.log(`Express running → PORT ${server.address().port}`));
// start rendering engine
app.set('view engine', 'pug');
app.set('views', 'public');
// define express props
app.use(express.static('public'));
app.use(express.urlencoded({extended: true}));
app.use(express.json());
// render view
app.get('/', (req, res) => {
res.render('index', {
title: `weather ☀`
});
});
Express 的视图和静态文件都是相对于当前工作目录的,这不是 javascript 文件的位置,而是您 运行 文件所在的位置。您可以看到带有 process.cwd()
的 cwd 和带有 __dirname
的文件位置,并观察它们有何不同。存在三种可能的修复方法:
将
'public'
的所有实例替换为__dirname + 'public'
或path.join(__dirname, 'public')
。这将使用文件的位置而不是 cwd 作为基本目录,这样无论 cwd 如何,您的程序都能正常工作。在您的程序开始时调用
process.chdir(__dirname)
将当前工作目录更改为文件的位置,这也将确保您的程序在任何情况下都能正确运行cwd.在 pm2 中用
--cwd /var/www/thewthr.app
启动你的程序。