ericf / express-handlebars

A Handlebars view engine for Express which doesn't suck.
BSD 3-Clause "New" or "Revised" License
2.31k stars 382 forks source link

Array for views gives "TypeError: Arguments to path.resolve must be strings" #124

Open sundarj opened 9 years ago

sundarj commented 9 years ago

Hi, I have express-handlebars 2.0.0 on express 4.12.3, and I think I've discovered a bug.

The aforementioned TypeError gets raised when I try and render a view. The line that seems to be causing it is line 193 of express-handlebars.js: view = this._getTemplateName(path.relative(viewsPath, viewPath)). Since I've passed an array to app.set('views'), viewsPath is also an array, and thus raises that error. I'd try and fix it myself, but I don't really know how I'd go about that.

Just in case it helps, here is my index.js (the error occurs when I visit /resonate/bts/editor):

var express = require('express');
var path = require('path');
var fs = require('fs');
var hbs = require('express-handlebars');
var app = express();

app.set('view options', {layout: false});
app.engine('.rsn', hbs({extname: '.rsn'}));
app.set('view engine', '.rsn');
app.set('views', [
  path.join(__dirname, 'resonate/bts',
  path.join(__dirname, 'resonate/template')
]);

app.enable('trust proxy');

...

var files = [];
walk('resonate/template', function(f,s) {
  files.push(f);
});

app.get('/resonate/bts/editor', function(req, res) {
  res.render('editor', {
    files: files
  });
});

app.use(require('compression')());
app.use(express.static(__dirname));
app.listen(8080);

Any ideas would be fantastic, thank you!

ericf commented 9 years ago

Makes sense that you'd get a type error when setting views to an array based on the current implementation of renderView(). This is also related to #112.

To support views being an array this code would need to be refactored. A new private method could be added to resolve view name, it could iterate over the views array until it finds a path which is contained in the viewPath string (indexOf === 0).

sundarj commented 9 years ago

Ah right, I see. Thanks a lot!

vanraizen commented 8 years ago

I just ran into this issue today as well. I imagine this will come up more as an issue as people migrate to Express4 / use multiple view directories.

woshi82 commented 7 years ago

did you fix the problem?it still throw err 'Path must be a string',when i set the views to an array . -_-