Ошибка: не удалось найти представление "index" в каталоге представлений "publi c" - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть простое веб-приложение, и когда я заново его развертываю или выполняю локально, оно работает нормально. Однако, когда я убиваю процесс 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 ☀`
    });
});

1 Ответ

1 голос
/ 03 апреля 2020

Express 'views и stati c файлы все относятся к текущему рабочему каталогу, который является не местоположением файла javascript, а местоположением, из которого вы запустили файл. Вы можете увидеть cwd с process.cwd() и расположение файла с __dirname, и наблюдать, как они отличаются. Существует три возможных исправления:

  1. Заменить все экземпляры 'public' на __dirname + 'public' или path.join(__dirname, 'public'). Это будет использовать расположение файла как базовый каталог вместо cwd и сделает так, чтобы ваша программа работала независимо от cwd.

  2. Вызовите process.chdir(__dirname) в начале вашего программа для изменения текущего рабочего каталога на местоположение файла, что также гарантирует правильную работу вашей программы независимо от cwd.

  3. Запустите вашу программу с --cwd /var/www/thewthr.app в pm2.

...