【问题标题】:Error: Failed to lookup view "index" in views directory "public"错误:无法在视图目录“public”中查找视图“index”
【发布时间】:2020-04-03 05:32:18
【问题描述】:

我有一个简单的网络应用程序,当我重新部署它或在本地​​执行它时,它工作正常。但是,当我终止 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 ☀`
    });
});

【问题讨论】:

  • 您的public 文件夹中需要有一个index.pug 文件。此外,将视图和静态文件放在同一个文件夹中也不是一个好主意。另外,请确保您在 pm2 中正确设置了 cwd。

标签: javascript node.js express pm2


【解决方案1】:

Express 的视图和静态文件都是相对于当前工作目录的,这不是 javascript 文件的位置,而是您运行文件的位置。你可以用process.cwd() 看到cwd,用__dirname 看到文件的位置,并观察它们有何不同。有三种可能的修复方法:

  1. 'public' 的所有实例替换为__dirname + 'public'path.join(__dirname, 'public')。这将使用文件的位置作为基本目录而不是 cwd,这样您的程序就可以在不考虑 cwd 的情况下工作。

  2. 在程序开始时调用process.chdir(__dirname),将当前工作目录更改为文件所在的位置,这也将保证您的程序无论cwd如何都能正确运行。

  3. 在 pm2 中使用 --cwd /var/www/thewthr.app 启动您的程序。

【讨论】:

  • 3.一个人为我解决!我认为它会自动将 index.js 的目录作为 cwd,但事实并非如此。谢谢!
猜你喜欢
  • 2022-11-14
  • 2018-11-01
  • 1970-01-01
  • 2017-01-14
  • 2017-12-20
  • 1970-01-01
  • 2021-06-26
  • 2021-04-03
  • 2017-03-24
相关资源
最近更新 更多