Ошибка: ENOENT: такого файла или каталога в экспресс-рулях нет - PullRequest
0 голосов
/ 28 июня 2019

Я использую express-handlebars для загрузки динамического контента в NodeJS

внутри app.js

const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
const pp = require("./util/path.js");
const adminRoutes = require("./routes/admin");
const shopRoutes = require("./routes/shop");
const expressHbs = require("express-handlebars");
const app = express();

app.engine("hbs",expressHbs());
app.set("view engine", "hbs");
app.set("views", "views");

app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, "public")));

app.use("/admin", adminRoutes.routes);
app.use(shopRoutes);

app.use((req, res, next) => {
  res.status(404).render("404", { pageTitle: "Page Not Found" });
});
app.listen(3001, "localhost", () => console.log("Listening on 3001 PORT"));

Когда функция expressHbs() не имеет параметров, она показывает следующую ошибку

Ошибка: ENOENT: такого файла или каталога нет, откройте 'C: \ dev \ nodejs \ maximi_course \ views \ layouts \ main.handlebars'

И когда я передам опциюобъект к нему:

app.engine(
  "hbs",
  expressHbs({
    extname: "hbs",
    layoutsDir: path.join(__dirname, "views")
  })
);

Показывает:

Ошибка: ENOENT: нет такого файла или каталога, откройте 'C: \ dev \ nodejs \ maximi_course \ views \ main.hbs '

Я искал решение, но не получил результата. На самом деле, я следую учебному пособию, и я сделал то же самое, что и учитель, но получил ошибку.

Наконец, я попробовал добавить свойство defaultLayout , и оно работает и загружает значение по умолчанию, но когда я изменяю URL на другую страницу, он всегда загружает ту же страницу, которую я установил по умолчанию

Вот папка проекта и все ее содержимое

Directory

1 Ответ

0 голосов
/ 28 июня 2019

На самом деле это немного раздражает проблема с express-handlebars, но она решается следующим образом:

  • Мне пришлось создать отдельный файл, который не является одним из Routes, и присвоить его имя defaultLayout
  • Мне пришлось установить путь к views/layouts/
  • Мне нужно было определить extname для расширения, которое я определил
app.engine(
  "hbs",
  expressHbs({
    extname: "hbs",
    defaultLayout: "main-layout",
    layoutsDir: "views/layouts/"
  })
);
...