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?
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');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"}));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, puede omitirse si no está utilizando un diseño).
extname(nombre de la extensión) depende de la elección del usuario.