express-handlebars
express-handlebars copied to clipboard
Array for views gives "TypeError: Arguments to path.resolve must be strings"
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!
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).
Ah right, I see. Thanks a lot!
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.
did you fix the problem?it still throw err 'Path must be a string',when i set the views to an array . -_-