Estoy tratando de usar el módulo express-handlebars pero tengo un error. Mi código:
var exphbs = require('express-handlebars'); app.engine('.hbs', exphbs({ extname: '.hbs', defaultLayout: "main"})); app.set('view engine', '.hbs');Mi error:
"app.engine('.hbs', exphbs({ extname: '.hbs', defaultLayout: "main"})); ^ TypeError: exphbs is not a function"Parece que no puedo entender por qué no funciona correctamente. ¿Algunas ideas?
Puede usar exphbs liabrary en lugar de express-handlebars .
Registrando motor de vista:
// view engine setup app.engine('hbs', require('exphbs')); app.set('view engine', 'hbs'); app.set('view options', { layout: 'main'});De forma predeterminada, exphbs busca un nombre de carpeta llamado parciales para el directorio de parciales y un nombre de carpeta llamado diseños para el directorio de diseños. Tanto las carpetas de parciales como las de diseños se encuentran en el directorio de vistas .
Debe usar "exphbs.engine" en lugar de "exphbs".
app.engine('.hbs', exphbs.engine({ extname: '.hbs', defaultLayout: "main"}));Reemplace con esto:
"app.engine('.hbs', exphbs({ extname: '.hbs', defaultLayout: "main"})); ^ TypeError: exphbs is not a function" Este error se puede resolver agregando una engine() function a la constante exphbs , O simplemente llamando a la función engine() .
exphbs.engine() , debido a que exphbs es una constante y no una función, tenemos que llamar a la función engine() desde el paquete express-handlebars , ¡para que podamos usar el motor de plantillas handlebars!
Puede obtener un segundo error si no está utilizando un archivo de diseño ( main.handlebars / main.hbs ).
Si alguien tiene problemas con el error de archivo main.handlebars / main.hbs .
Puede establecer el defaultLayout como null .
Algo como esto:
const expressHbs = require('express-handlebars'); app.engine('handlebars', expressHbs.engine({ layoutsDir: 'views/layouts/', defaultLayout: null, extname: 'handlebars' }) ); app.set('view engine', 'handlebars'); app.set('views', 'views'); // optional
layoutsDires la ubicación de sus diseños (si hay alguno, se puede omitir si no está utilizando un diseño).
extname(nombre de la extensión) depende de la elección del usuario.
Si desea usar express-handlebars con el módulo commonJS , debe importarlo así:
const express = require('express'); const { engine } = require('express-handlebars'); const app = express(); app.engine('handlebars', engine({ extname: '.hbs', defaultLayout: "main"})); app.set('view engine', 'handlebars'); app.set("views", "./views"); app.get('/', (req, res) => { res.render('home'); }); app.listen(3000);Si desea utilizar el módulo ES6 , puede seguir el archivo Léame oficial
const { engine } = require('express-handlebars');y
app.engine('handlebars', engine({ extname: '.hbs', defaultLayout: "main"}));Tienes dos opciones para solucionar esto
1er método-
En este solo tienes que actualizar una sola palabra .enigne
Cambia esto:
app.engine('.hbs', exphbs({ extname: '.hbs', defaultLayout: "main"}));Para
app.engine('.hbs', exphbs.engine({ extname: '.hbs', defaultLayout: "main"}));2do método-
En esto hay que actualizar
var exphbs = require('express-handlebars');Para
const { engine } = require('express-handlebars');Y
app.engine('.hbs', exphbs({ extname: '.hbs', defaultLayout: "main"}));Para
app.engine('handlebars', engine({ extname: '.hbs', defaultLayout: "main"}));Buena suerte
así es, según la documentación de hbs , esta opción hará el trabajo.
import express from 'express'; import { engine } from 'express-handlebars'; const app = express(); app.engine('.hbs', engine({extname: '.hbs'})); app.set('view engine', '.hbs'); app.set('views', './views');