balderdashy/sails · warning

A leading `.` is not required in the config.views.extension

Error message

A leading `.` is not required in the config.views.extension option.  Removing it for you...

What it means

Sails expects `sails.config.views.extension` to be a bare extension string like 'ejs' (or `false`). If it starts with a dot, Sails logs this warning and silently strips the leading dot so template lookups still resolve. It is auto-corrected, not fatal.

Source

Thrown at lib/hooks/views/configure.js:36

  if (sails.config.views.engine) {
    sails.log.debug('The `config.views.engine` config has been deprecated.');
    sails.log.debug('In Sails 1.x, use `config.views.extension` to choose your view');
    sails.log.debug('extension (defaults to ".ejs"), and use `config.views.getRenderFn`');
    sails.log.debug('to configure your template engine or leave it undefined to use');
    sails.log.debug('the built-in EJS template support.\n');
    sails.config.views.extension = sails.config.views.engine.ext || 'ejs';
    delete sails.config.views.engine;
  }


  // Make sure the extension is valid.
  if (sails.config.views.extension === '' || (!_.isString(sails.config.views.extension) && sails.config.views.extension !== false)) {
    throw flaverr({ name: 'userError', code: 'E_INVALID_VIEW_CONFIG' }, new Error('`sails.config.views.extension` must either be a string or `false`.'));
  }

  // Let user know that a leading . is not required in the viewEngine option and then fix it
  if (sails.config.views.extension[0] === '.') {
    sails.log.warn('A leading `.` is not required in the config.views.extension option.  Removing it for you...');
    sails.config.views.extension = sails.config.views.extension.substr(1);
  }

  // Make sure the `getRenderFn` is valid, if provided.
  if (!_.isUndefined(sails.config.views.getRenderFn) && !_.isFunction(sails.config.views.getRenderFn)) {
    throw flaverr({ name: 'userError', code: 'E_INVALID_VIEW_CONFIG' }, new Error('`sails.config.views.getRenderFn`, if provided, must be a function (got ' + util.inspect(sails.config.views.getRenderFn) + ')'));
  }

  else if (sails.config.views.getRenderFn) {
    var renderFn = sails.config.views.getRenderFn();
    if (!_.isFunction(renderFn)) {
      throw flaverr({ name: 'userError', code: 'E_INVALID_VIEW_CONFIG' }, new Error('`sails.config.views.getRenderFn` returned an invalid value. (expected a function, but got: ' + util.inspect(renderFn) + ')'));
    }
    sails.hooks.views._renderFn = renderFn;

    if (sails.config.views.layout) {
      sails.log.error('Ignoring `sails.config.views.layout`...');
      sails.log.error('Sails\' built-in layout support only works with the default EJS view engine.');

View on GitHub (pinned to 7b76422cc2)

Solutions

  1. Remove the leading dot from the extension in config/views.js
  2. Leave the value as `false` if views have no extension

Example fix

// before
extension: '.ejs'
// after
extension: 'ejs'
Defensive patterns

Strategy: validation

Validate before calling

const ext = sails.config.views.extension;
if (typeof ext === 'string' && ext[0] === '.') {
  sails.config.views.extension = ext.slice(1);
}

Type guard

function isValidViewExtension(ext) {
  return ext === false || (typeof ext === 'string' && !ext.startsWith('.'));
}

Prevention

When it happens

Trigger: Configuring `sails.config.views.extension = '.ejs'` (with leading dot) in config/views.js and lifting the app.

Common situations: Developers migrating from Express-style `view engine: 'ext.ejs'` conventions or guessing the format, accidentally including the dot.

Related errors


AI-assisted analysis of balderdashy/sails@7b76422cc2 (2026-09-01). Data as JSON: /api/errors/e2a50aac467af989. Report an issue: GitHub.