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
- Remove the leading dot from the extension in config/views.js
- 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
- Never prefix config.views.extension with a dot
- Use `false` for extensionless views
- Copy the stock config/views.js as the template
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
- Cannot call res.render() - `req._sails.renderView` was not a
- E_VIEW_INFER
- i18n hook has disabled itself due to misconfiguration -- ret
- Invalid CORS settings for route ${route}
- `res.guessView()` is deprecated in Sails >= v1.0. If you wa
AI-assisted analysis of balderdashy/sails@7b76422cc2 (2026-09-01).
Data as JSON: /api/errors/e2a50aac467af989.
Report an issue: GitHub.