balderdashy/sails · warning
The session middleware encountered an error and triggered it
Error message
The session middleware encountered an error and triggered its callback, but response headers have already been sent. Rather than attempting to send another response, failing silently...
What it means
Sails' session middleware error handler logs the session error, but if response headers were already sent (res.headersSent), it cannot send another response, so it logs this warning and gives up silently. It means a session-store error occurred mid-response (e.g. after the response began streaming), and only the log records it — the client gets no 400.
Source
Thrown at lib/hooks/http/get-configured-http-middleware-fns.js:95
var configuredSessionMiddleware = sails._privateSessionMiddleware;
return function session(req, res, next){
// --•
// Run the session middleware.
configuredSessionMiddleware(req,res,function (err) {
if (!err) {
return next();
}
var errMsg = 'Error occurred in session middleware :: ' + util.inspect((err&&err.stack)?err.stack:err, false, null);
sails.log.error(errMsg);
// If headers have already been sent (e.g. because of timing issues in application-level code),
// then don't attempt to send another response.
// (but still log a warning)
if (res.headersSent) {
sails.log.warn('The session middleware encountered an error and triggered its callback, but response headers have already been sent. Rather than attempting to send another response, failing silently...');
return;
}
// --•
// Otherwise, we can go ahead and send a response.
return res.status(400).send(errMsg);
});
};
})(),
// Build configured favicon mwr function.
favicon: (function (){
var toServeFavicon = require('serve-favicon');
var pathToDefaultFavicon = Path.resolve(__dirname,'./default-favicon.ico');
var serveFaviconMwr = toServeFavicon(pathToDefaultFavicon);
return serveFaviconMwr;View on GitHub (pinned to 7b76422cc2)
Solutions
- Check the errMsg logged above the warning — it names the actual session-store error.
- Verify the session store (Redis/Mongo/etc.) is reachable and credentials are correct.
- Tune session store timeouts and ensure responses are not started before session work completes.
- Avoid streaming responses before the session middleware finishes; finish session reads first.
- Consider disabling sessions on routes that don't need them.
Example fix
// before: response starts before session error handled
res.write('partial data'); // headers sent; session error now can't respond
// after: await/check session-dependent setup before writing
if (!res.headersSent) { res.status(400).send(errMsg); } Defensive patterns
Strategy: fallback
Validate before calling
// health-check the session store before lift
const store = require('connect-redis')({ client: redis });
store.get('probe', function (err) { if (err) throw err; }); Type guard
function canRespond(res) { return !res.headersSent; } Try / catch
if (!res.headersSent) { res.status(400).send(errMsg); } else { sails.log.warn('headers sent; skipped error response'); } Prevention
- Keep session store (Redis/Mongo) reachable and monitored.
- Set sane session-store connect/timeout options.
- Don't start streaming responses before session-dependent setup completes.
- Disable sessions on routes that don't need them.
When it happens
Trigger: The session store callback fires with an error after application code already called res.write/res.end (timing issues), e.g. slow/hanging session store (connect.redis, connect-mongo) timing out while a response is streaming.
Common situations: Redis/Mongo session store unreachable or evicting connections; long-running/streamed responses racing the session middleware; session middleware timing out under load.
Related errors
- Invalid regex "${regex}" supplied to skipRegexesWrapper; ign
- Cannot call res.render() - `req._sails.renderView` was not a
- The 2-ary usage of `res.redirect()` is no longer supported i
- Cannot write to response more than once
- rc(name): name *must* be string
AI-assisted analysis of balderdashy/sails@7b76422cc2 (2026-09-01).
Data as JSON: /api/errors/3d9920b044d9cffa.
Report an issue: GitHub.