Skip to content

Migrating from 3.x to 4.x

Jonathan Ong edited this page Mar 8, 2014 · 36 revisions

Express 3.x to 4.0 migration guide. You may also be interested in New features in 4.x.

See Express 4.x docs for more examples and complete API documentation.

Overview

Express 4 no longer has connect as a dependency. This means that ALL of the bundled middleware (except static) is no longer available on the express module. Each of these middlewares is available as modules referenced below. This change was made to allow for these middleware to receive fixes, updates, and releases without impacting express release cycles and vice versa.

others documented here https://github.com/senchalabs/connect#middleware

Removed

app.configure()

This method is no longer available. If you wish to configure different routes based on environment, use an if statement or alternative module.

app.configure('development', function() {
   // configure stuff here
});
// becomes
var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
   // configure stuff here
}

app.router

The middleware stack has been overhauled to avoid confusion with .use vs .get (or other HTTP verbs) and as a result, the need to every manually do app.use(app.router) has been removed. See the Routers section below on the new middleware and routing apis.

If you had code that looked like this:

app.use(cookieParser());
app.use(bodyParser());
/// .. other middleware .. doesn't matter what
app.use(app.router); // <--- this line will be removed

// more middleware (executes after routes)
app.use(function(req, res, next);
// error handling middleware
app.use(function(err, req, res, next) {});

app.get('/' ...);
app.post(...);

app.router has been removed and middleware and routes are executed in the order they are added. Your code should move any calls to app.use that came after app.use(app.router) after any routes (HTTP verbs).

app.use(cookieParser());
app.use(bodyParser());
/// .. other middleware .. doesn't matter what

app.get('/' ...);
app.post(...);

// more middleware (executes after routes)
app.use(function(req, res, next);
// error handling middleware
app.use(function(err, req, res, next) {});

express.createServer()

Long deprecated. Just use express() to create a new app.

connect and connect middleware

All connect middleware lives in separate modules with the exception of express.static which is provided for convenience. Everything else benefits from being a separate module with its own versioning.

changed

req.accepted()

Use req.accepts() instead.

  • req.accepts()
  • req.acceptsEncodings()
  • req.acceptsCharsets()
  • req.acceptsLanguages()

All use accepts internally. Please refer to accepts for any issues or documentation requests.

Note that these properties may have changed from arrays to functions. To use them as "arrays", simply don't pass any arguments. For example, req.acceptsLanguages() // => ['en', 'es', 'fr'].

res.location()

No longer does relative URL resolution. Browsers will handle relative urls themselves.

app.route -> app.mountpath

When mounting an express app in another express app

config changes

  • json spaces no longer enabled by default in development

req.params

Is now an object instead of an array. This will not break your app if you used the req.params[##] style for regexp routes where parameter names are not known.

res.locals

Is no longer a function. It is a plain js object. Treat it as such.

res.headerSent

Changed to headersSent to match the node.js ServerResponse object. Your app likely didn't use this and thus it won't be an issue.

req.is

Uses type-is internally now. Please refer to type-is for any issues or documentation requests.

added

app.route(path)

Returns a new Route instance. A Route is invoked when a request matching the route path is received. Routes can have their own middleware stacks and have methods for the http VERBS to process requests.

See the Routes and Routing docs to better understand how to create routes in express.

Router and Route middleware

The Router has been overhauled to be a full fledge middleware router. The Router is a good way to separate your routes into files/modules without sacrificing features like parameter matching and middleware. See the Routes and Routing docs.

Clone this wiki locally