Error: ENOENT: no such file or directory in express-handlebars

Error: ENOENT: no such file or directory in express-handlebars

我正在使用 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()函数没有参数时会显示以下错误

Error: ENOENT: no such file or directory, open 'C:\dev\nodejs\maximi_course\views\layouts\main.handlebars'

当我向它传递一个选项 object 时:

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

显示:

Error: ENOENT: no such file or directory, open 'C:\dev\nodejs\maximi_course\views\main.hbs'

我已经搜索了一个解决方案,但我没有得到任何结果,实际上我正在按照教程进行操作并且我已经按照老师的方法做了但是我得到了一个错误。

我尝试的最后一件事是添加 defaultLayout 属性 它可以工作并加载默认值但是当我将 url 更改为另一个页面时它始终加载我设置为默认的相同页面

这是项目文件夹及其所有内容

实际上 express-handlebars 有点烦人的问题,但解决方法如下:

  • 我不得不创建一个独立文件,它不是 Routes 之一,并将其​​名称分配给 defaultLayout
  • 我必须将路径设置为 views/layouts/
  • 我必须将 extname 定义为我定义的扩展
app.engine(
  "hbs",
  expressHbs({
    extname: "hbs",
    defaultLayout: "main-layout",
    layoutsDir: "views/layouts/"
  })
);

节点.js/Expressjs

问。错误:ENOENT:没有那个文件或目录,打开 'S:\globle_express\views\layouts\main.handlebars'

回答。

enter image description here

Rename your layout folder and do layouts

The folder structure of Expressjs should be like this

无需使用 it.create 'views' 文件夹中的文件创建布局文件夹并添加该文件。例如'form.handlebars'然后根据你的代码做下面的事情

    app.get('/' (req,res)=> {
      res.render("contact", {
      layout: false,
      name: req.body.name,
      quote: req.body.quote
      });
    })

我遇到了同样的问题,并通过以下方法解决了这个问题:

app.engine(
  "hbs",
  expressHbs({
    extname: "hbs",
    defaultLayout: false,
    layoutsDir: "views/layouts/"
  })
);

express-handlebars.js@4.0.1定义了如下配置选项

function ExpressHandlebars(config) {
    // Config properties with defaults.
    utils.assign(this, {
        handlebars     : Handlebars,
        extname        : '.handlebars',
        layoutsDir     : undefined, // Default layouts directory is relative to `express settings.view` + `layouts/`
        partialsDir    : undefined, // Default partials directory is relative to `express settings.view` + `partials/`
        defaultLayout  : 'main',
        helpers        : undefined,
        compilerOptions: undefined,
    }, config);

如果您不使用默认布局,您可以像下面那样设置 defaultLayout: false

app.engine(
  "hbs",
  expressHbs({
    extname: "hbs",
    defaultLayout: false
  })
);

将此添加到您的 app.js

app.locals.layout = false;

Need to set defaultLayout as false, else "express-handlebars" will search for main.handlebars.

app.engine("hbs", expressHbs({ defaultLayout: false }));
app.set("view engine", "hbs");
app.set("views", "views");

将 defaultLayout 设置为 false 将解决此问题。 我的代码对我来说工作得很好。

    app.engine('hbs',hbs(
  {
    extname:'hbs', 
    defaultLayout:false,
    layoutDir:__dirname+'/views/layout/', 
    partialsDir:__dirname+'/views/partials/'
  }
  ))

最好将文件夹名称保留为布局,里面的文件名是 layout.hbs 而不是 's'。

重命名文件夹后,我之前的代码与我完美配合。

app.engine('hbs',hbs(
  {
    extname:'hbs', 
    defaultLayout:'layout',
    layoutDir:__dirname+'/views/layouts/', 
    partialsDir:__dirname+'/views/partials/'
  }
  ))
 app.engine(
  'hbs',
  hbs.express4({
    defaultLayout: false,
    partialsDir: __dirname + '/views/partials'
  })
);

快递4

您可以简单地添加:

app.engine('handlebars', exphbs.engine());
app.set('view engine', 'handlebars')

它对我有效。 谢谢:)