Search code examples
javascriptnode.jsexpresshandlebars.jsexpress-handlebars

ERR_INVALID_ARG_TYPE - The "from" argument must be of type string. Received an instance of Array


I am trying to add two directories for view folders. In the docs, I found that you can add string or array in order to add multiple view folders.

One is for the admin panel and the other one is for website/public usage.

So I added in the following way:

/**
 * setting up the view engine
 */
app.engine('handlebars', hbs({
    defaultLayout: "main"
}));
app.set('view engine', 'handlebars');

app.set('views', [path.join(__dirname, 'views'), path.join(__dirname, 'public-views/zubizi-theme')]);
// end view engine setup

I am getting the following error:

TypeError [ERR_INVALID_ARG_TYPE]: The "from" argument must be of type string. Received an instance of Array

(node:108) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "from" argument must be of type string. Received an instance of Array
    at validateString (internal/validators.js:117:11)
    at Object.relative (path.js:437:5)
    at ExpressHandlebars.renderView (F:\zubizi\cms\files\node_modules\express-handlebars\lib\express-handlebars.js:193:38)
    at View.render (F:\zubizi\cms\files\node_modules\express\lib\view.js:135:8)
    at tryRender (F:\zubizi\cms\files\node_modules\express\lib\application.js:640:10)
    at Function.render (F:\zubizi\cms\files\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (F:\zubizi\cms\files\node_modules\express\lib\response.js:1008:7)
    at F:\zubizi\cms\files\routes\admin.js:7:6
    at Layer.handle [as handle_request] (F:\zubizi\cms\files\node_modules\express\lib\router\layer.js:95:5)
    at next (F:\zubizi\cms\files\node_modules\express\lib\router\route.js:137:13)
(node:108) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:108) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

.

This is my folder structure look like:

enter image description here

.

I'm using the following technologies in my app:

NodeJS Templating engine: express-handlebars.

ExpressJS version: 4.16.0

Node JS version: v12.16.3


Solution

  • There's an open PR to support multiple view directores passed in as an array: https://github.com/ericf/express-handlebars/pull/209

    For now, you need to fix your setup and merge your views in one directory and pass only that directory:

    app.set('views', './path-to-views-folder');