快递把手没有找到我的布局或部分

Jak*_*son 2 layout node.js express handlebars.js

我有以下Express 4视图引擎设置:

var handlebars = require('express-handlebars').create({
  layoutsDir: path.join(__dirname, "views/layouts"),
  partialsDir: path.join(__dirname, "views/partials"),
  defaultLayout: 'layout',
  extname: 'hbs'
});

app.engine('handlebars', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
Run Code Online (Sandbox Code Playgroud)

我有以下文件结构:

/views
    error.hbs
    index.hbs
    /partials
        menu.hbs
    /layouts
        layout.hbs
Run Code Online (Sandbox Code Playgroud)

最后在我的路线: res.render('index');

访问我的网站,它只加载我的index.hbs模板.它不使用我的layout.hbs.我没有任何错误或任何错误.它只是不使用布局,即使layout在把手配置中设置为我的默认布局.

接下来我尝试将我的代码更改为:

res.render('index', {layout: 'layout'});

现在我收到错误:

Error: ENOENT: no such file or directory, open '/.../views/layout.hbs'

所以它就像是找不到我layoutsDir......我在这里想念的是什么?

接下来我改为:

res.render('index', {layout: 'layouts/layout'});

好的,这样才有用.我的布局现已加载.但后来我添加了部分布局:

{{> menu }}

现在我得到: /.../views/index.hbs: The partial menu could not be found

那么这里发生了什么?为什么车把不承认我layoutsDirpartialsDir?它根本就没有看到它们或什么.为什么defaultLayout没有被使用?我不得不指定布局.

Jam*_*ubb 6

根据快递把手的API文档,如果您从默认.handlebars设置更改文件扩展名,那么当您设置视图引擎时,所有出现的把手都应该替换为您要使用的新扩展名.

因此,您的快速设置需要更新为:

app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));
Run Code Online (Sandbox Code Playgroud)

注意:文档使用扩展名之前的句点,例如.hbs,但它似乎没有这个.

完整代码:

var path = require('path');
var express = require('express');
var app = express();
var http = require('http').Server(app);

var handlebars = require('express-handlebars').create({
  layoutsDir: path.join(__dirname, "views/layouts"),
  partialsDir: path.join(__dirname, "views/partials"),
  defaultLayout: 'layout',
  extname: 'hbs'
});

app.engine('hbs', handlebars.engine);
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, "views"));

app.get('/', function(req, res){
  res.render('index');
});


http.listen(3000, function(){
  console.log("Server running");
});
Run Code Online (Sandbox Code Playgroud)