TypeError: this.engine no es una función cuando se intenta usar el bigote en Express JS

Como la primera cosa que probé en NodeJS, estoy creando una aplicación simple que muestra una página HTML que les dice a los visitantes su dirección IP.

Así es como se ve

var express = require('express'); var app = express(); app.set('view engine', 'mu2'); app.get('/', function (req, res) { res.setHeader('Content-Type', 'text/html'); // Do I have to do this? I'm not sure. res.render('frontPage.html', { ip: req.ip }); res.send(); }); app.listen(8080, function() { console.log("Listening on port 8080"); }); 

Aquí es cómo se ve /views/frontPage.html :

    Hello, World!   

Hello, World!


If you're reading this, the NodeJS setup is working. Check your developer console. See if there's any HTTP error in there.

Anyway, your IP address is {{ip}}

Y esto es lo que recibo en la consola cada vez que envío una solicitud:

 TypeError: this.engine is not a function at View.render (/Users/macuser/NodeJS/hello/node_modules/express/lib/view.js:126:8) at tryRender (/Users/macuser/NodeJS/hello/node_modules/express/lib/application.js:639:10) at EventEmitter.render (/Users/macuser/NodeJS/hello/node_modules/express/lib/application.js:591:3) at ServerResponse.render (/Users/macuser/NodeJS/hello/node_modules/express/lib/response.js:960:7) at /Users/macuser/NodeJS/hello/index.js:8:9 at Layer.handle [as handle_request] (/Users/macuser/NodeJS/hello/node_modules/express/lib/router/layer.js:95:5) at next (/Users/macuser/NodeJS/hello/node_modules/express/lib/router/route.js:131:13) at Route.dispatch (/Users/macuser/NodeJS/hello/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/Users/macuser/NodeJS/hello/node_modules/express/lib/router/layer.js:95:5) at /Users/macuser/NodeJS/hello/node_modules/express/lib/router/index.js:277:22 

Ya frontPage.html dentro de views/ y ya instalé Mustache from NPM ( npm install mu2 --save ). ¿Qué tiene de malo?

Terminé pasando por alto el sistema de plantillas de Express y compileAndRender() . Me gusta esto:

 var express = require('express'); var app = express(); var mu2 = require('mu2'); mu2.root = __dirname + '/views'; app.get('/', function (req, res) { var htmlStream = mu2.compileAndRender('frontPage.html', {ip: req.ip}); htmlStream.pipe(res); }); app.listen(8080, function () { console.log("Listening on port 8080"); }); 

Ahora funciona.

Necesita cambiar su extensión de archivo de .html a .mu2. res.render('frontPage.mu2', { ip: req.ip}); ya que es un archivo de bigote no un archivo HTML. También puede dejar la extensión de archivo desactivada ya que configura el renderizador de vista predeterminado en mu2, y Express lo usará como motor de renderización si no se proporciona una extensión de archivo. Me gusta esto … res.render('frontPage', {ip: req.ip}); . Tenga en cuenta que la primera parte es la ruta del archivo ‘/ frontPage’ y la segunda parte es un objeto local que está pasando a la plantilla. Accederá a la propiedad ip de ese objeto algo como esto {{ip}} dentro de su archivo .mu2. El bigote devuelve el HTML representado para expresslo, y res.render lo envía al cliente.

Además, no necesita res.send (), ya que res.render () representa una vista y envía la cadena HTML representada al cliente, y dado que también se asume texto / html en las respuestas o tipo String, no necesita el res.setHeader (‘Content-Type’, ‘text-html’); pero tampoco 😉

De expressjs.com

res.render (view [, locals] [, callback]) Representa una vista y envía la cadena HTML representada al cliente. Parámetros opcionales:

locals , un objeto cuyas propiedades definen variables locales para la vista.

callback , una función de callback. Si se proporciona, el método devuelve tanto el posible error como la cadena representada, pero no realiza una respuesta automática. Cuando se produce un error, el método invoca next (err) internamente.

El argumento de vista es una cadena que es la ruta de acceso del archivo de vista que se va a representar. Puede ser una ruta absoluta o una ruta relativa a la configuración de las vistas. Si la ruta no contiene una extensión de archivo, la configuración del motor de vista determina la extensión del archivo. Si la ruta contiene una extensión de archivo, Express cargará el módulo para el motor de plantilla especificado (a través de require ()) y lo procesará utilizando la función __express del módulo cargado.

    Intereting Posts