From 3a4306b033483802cb4a131934cc96652a9758ba Mon Sep 17 00:00:00 2001 From: mayank choudhary Date: Tue, 11 Nov 2025 11:35:24 +0530 Subject: [PATCH 1/2] docs: add send.mime note to migration guide --- en/guide/migrating-4.md | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/en/guide/migrating-4.md b/en/guide/migrating-4.md index a45f550a27..864ef6bf60 100755 --- a/en/guide/migrating-4.md +++ b/en/guide/migrating-4.md @@ -312,6 +312,56 @@ Functionality is now limited to setting the basic cookie value. Use

Example app migration

+

`send.mime`

+ +Some older applications relied on the `send` module's internal MIME helpers +via `send.mime` for looking up or defining MIME types. That internal API is +no longer exposed in newer versions. If your code uses `send.mime`, replace +those calls with a standalone MIME library such as `mime-types` or `mime`. + +Important: the default MIME type fallback (`send.mime`) was removed in +`send@0.18.0`. If your app relies on default MIME type detection, you must +now configure this behavior manually. See the release notes for details: +https://github.com/pillarjs/send/releases/tag/0.18.0-beta.1 + +- Install a replacement package: + +```bash +npm install mime-types --save +# or +npm install mime --save +``` + +- Lookup MIME type with `mime-types`: + +```js +const mime = require('mime-types'); + +mime.lookup('file.html'); // 'text/html' +mime.contentType('file.html'); // 'text/html; charset=utf-8' +``` + +- Lookup MIME type with `mime`: + +```js +const mime = require('mime'); + +mime.getType('file.html'); // 'text/html' +``` + +- Define custom types (when using `mime`): + +```js +const mime = require('mime'); + +mime.define({ 'application/x-myapp': ['myext'] }, true); +``` + +Note: in many cases `express.static`, `res.type()`, and `res.sendFile()` will +set the Content-Type header automatically, so prefer those helpers rather +than manual MIME lookups when possible. + + Here is an example of migrating an Express 3 application to Express 4. The files of interest are `app.js` and `package.json`. From d61eefdc9d77181253321bede7930c31f4f63ada Mon Sep 17 00:00:00 2001 From: mayank choudhary Date: Tue, 11 Nov 2025 11:50:09 +0530 Subject: [PATCH 2/2] docs: add send.mime removal note in migration guide --- en/guide/migrating-4.md | 551 ---------------------------------------- 1 file changed, 551 deletions(-) diff --git a/en/guide/migrating-4.md b/en/guide/migrating-4.md index 864ef6bf60..0122679668 100755 --- a/en/guide/migrating-4.md +++ b/en/guide/migrating-4.md @@ -106,554 +106,3 @@ app.use('/book/:id', (req, res, next) => { console.log('ID:', req.params.id) next() }) -``` -

-The routing system -

- -Apps now implicitly load routing middleware, so you no longer have to -worry about the order in which middleware is loaded with respect to -the `router` middleware. - -The way you define routes is unchanged, but the routing system has two -new features to help organize your routes: - -{: .doclist } -* A new method, `app.route()`, to create chainable route handlers for a route path. -* A new class, `express.Router`, to create modular mountable route handlers. - -

app.route() method

- -The new `app.route()` method enables you to create chainable route handlers -for a route path. Because the path is specified in a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more -information about routes, see [`Router()` documentation](/{{ page.lang }}/4x/api.html#router). - -Here is an example of chained route handlers that are defined by using the `app.route()` function. - -```js -app.route('/book') - .get((req, res) => { - res.send('Get a random book') - }) - .post((req, res) => { - res.send('Add a book') - }) - .put((req, res) => { - res.send('Update the book') - }) -``` - -

express.Router class

- -The other feature that helps to organize routes is a new class, -`express.Router`, that you can use to create modular mountable -route handlers. A `Router` instance is a complete middleware and -routing system; for this reason it is often referred to as a "mini-app". - -The following example creates a router as a module, loads middleware in -it, defines some routes, and mounts it on a path on the main app. - -For example, create a router file named `birds.js` in the app directory, -with the following content: - -```js -var express = require('express') -var router = express.Router() - -// middleware specific to this router -router.use((req, res, next) => { - console.log('Time: ', Date.now()) - next() -}) -// define the home page route -router.get('/', (req, res) => { - res.send('Birds home page') -}) -// define the about route -router.get('/about', (req, res) => { - res.send('About birds') -}) - -module.exports = router -``` - -Then, load the router module in the app: - -```js -var birds = require('./birds') - -// ... - -app.use('/birds', birds) -``` - -The app will now be able to handle requests to the `/birds` and -`/birds/about` paths, and will call the `timeLog` -middleware that is specific to the route. - -

-Other changes -

- -The following table lists other small but important changes in Express 4: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ObjectDescription
Node.jsExpress 4 requires Node.js 0.10.x or later and has dropped support for -Node.js 0.8.x.
-`http.createServer()` - -The `http` module is no longer needed, unless you need to directly work with it (socket.io/SPDY/HTTPS). The app can be started by using the -`app.listen()` function. -
-`app.configure()` - -The `app.configure()` function has been removed. Use the -`process.env.NODE_ENV` or -`app.get('env')` function to detect the environment and configure the app accordingly. -
-`json spaces` - -The `json spaces` application property is disabled by default in Express 4. -
-`req.accepted()` - -Use `req.accepts()`, `req.acceptsEncodings()`, -`req.acceptsCharsets()`, and `req.acceptsLanguages()`. -
-`res.location()` - -No longer resolves relative URLs. -
-`req.params` - -Was an array; now an object. -
-`res.locals` - -Was a function; now an object. -
-`res.headerSent` - -Changed to `res.headersSent`. -
-`app.route` - -Now available as `app.mountpath`. -
-`res.on('header')` - -Removed. -
-`res.charset` - -Removed. -
-`res.setHeader('Set-Cookie', val)` - -Functionality is now limited to setting the basic cookie value. Use -`res.cookie()` for added functionality. -
- -

Example app migration

- -

`send.mime`

- -Some older applications relied on the `send` module's internal MIME helpers -via `send.mime` for looking up or defining MIME types. That internal API is -no longer exposed in newer versions. If your code uses `send.mime`, replace -those calls with a standalone MIME library such as `mime-types` or `mime`. - -Important: the default MIME type fallback (`send.mime`) was removed in -`send@0.18.0`. If your app relies on default MIME type detection, you must -now configure this behavior manually. See the release notes for details: -https://github.com/pillarjs/send/releases/tag/0.18.0-beta.1 - -- Install a replacement package: - -```bash -npm install mime-types --save -# or -npm install mime --save -``` - -- Lookup MIME type with `mime-types`: - -```js -const mime = require('mime-types'); - -mime.lookup('file.html'); // 'text/html' -mime.contentType('file.html'); // 'text/html; charset=utf-8' -``` - -- Lookup MIME type with `mime`: - -```js -const mime = require('mime'); - -mime.getType('file.html'); // 'text/html' -``` - -- Define custom types (when using `mime`): - -```js -const mime = require('mime'); - -mime.define({ 'application/x-myapp': ['myext'] }, true); -``` - -Note: in many cases `express.static`, `res.type()`, and `res.sendFile()` will -set the Content-Type header automatically, so prefer those helpers rather -than manual MIME lookups when possible. - - -Here is an example of migrating an Express 3 application to Express 4. -The files of interest are `app.js` and `package.json`. - -

-Version 3 app -

- -

app.js

- -Consider an Express v.3 application with the following `app.js` file: - -```js -var express = require('express') -var routes = require('./routes') -var user = require('./routes/user') -var http = require('http') -var path = require('path') - -var app = express() - -// all environments -app.set('port', process.env.PORT || 3000) -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'pug') -app.use(express.favicon()) -app.use(express.logger('dev')) -app.use(express.methodOverride()) -app.use(express.session({ secret: 'your secret here' })) -app.use(express.bodyParser()) -app.use(app.router) -app.use(express.static(path.join(__dirname, 'public'))) - -// development only -if (app.get('env') === 'development') { - app.use(express.errorHandler()) -} - -app.get('/', routes.index) -app.get('/users', user.list) - -http.createServer(app).listen(app.get('port'), () => { - console.log('Express server listening on port ' + app.get('port')) -}) -``` - -

package.json

- -The accompanying version 3 `package.json` file might look - something like this: - -```json -{ - "name": "application-name", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node app.js" - }, - "dependencies": { - "express": "3.12.0", - "pug": "*" - } -} -``` - -

-Process -

- -Begin the migration process by installing the required middleware for the -Express 4 app and updating Express and Pug to their respective latest -version with the following command: - -```bash -$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save -``` - -Make the following changes to `app.js`: - -1. The built-in Express middleware functions `express.favicon`, - `express.logger`, `express.methodOverride`, - `express.session`, `express.bodyParser` and - `express.errorHandler` are no longer available on the - `express` object. You must install their alternatives - manually and load them in the app. - -2. You no longer need to load the `app.router` function. - It is not a valid Express 4 app object, so remove the - `app.use(app.router);` code. - -3. Make sure that the middleware functions are loaded in the correct order - load `errorHandler` after loading the app routes. - -

Version 4 app

- -

package.json

- -Running the above `npm` command will update `package.json` as follows: - -```json -{ - "name": "application-name", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node app.js" - }, - "dependencies": { - "body-parser": "^1.5.2", - "errorhandler": "^1.1.1", - "express": "^4.8.0", - "express-session": "^1.7.2", - "pug": "^2.0.0", - "method-override": "^2.1.2", - "morgan": "^1.2.2", - "multer": "^0.1.3", - "serve-favicon": "^2.0.1" - } -} -``` - -

app.js

- -Then, remove invalid code, load the required middleware, and make other -changes as necessary. The `app.js` file will look like this: - -```js -var http = require('http') -var express = require('express') -var routes = require('./routes') -var user = require('./routes/user') -var path = require('path') - -var favicon = require('serve-favicon') -var logger = require('morgan') -var methodOverride = require('method-override') -var session = require('express-session') -var bodyParser = require('body-parser') -var multer = require('multer') -var errorHandler = require('errorhandler') - -var app = express() - -// all environments -app.set('port', process.env.PORT || 3000) -app.set('views', path.join(__dirname, 'views')) -app.set('view engine', 'pug') -app.use(favicon(path.join(__dirname, '/public/favicon.ico'))) -app.use(logger('dev')) -app.use(methodOverride()) -app.use(session({ - resave: true, - saveUninitialized: true, - secret: 'uwotm8' -})) -app.use(bodyParser.json()) -app.use(bodyParser.urlencoded({ extended: true })) -app.use(multer()) -app.use(express.static(path.join(__dirname, 'public'))) - -app.get('/', routes.index) -app.get('/users', user.list) - -// error handling middleware should be loaded after the loading the routes -if (app.get('env') === 'development') { - app.use(errorHandler()) -} - -var server = http.createServer(app) -server.listen(app.get('port'), () => { - console.log('Express server listening on port ' + app.get('port')) -}) -``` - -
-Unless you need to work directly with the `http` module (socket.io/SPDY/HTTPS), loading it is not required, and the app can be simply started this way: - -```js -app.listen(app.get('port'), () => { - console.log('Express server listening on port ' + app.get('port')) -}) -``` -
- -

Run the app

- -The migration process is complete, and the app is now an -Express 4 app. To confirm, start the app by using the following command: - -```bash -$ node . -``` - -Load [http://localhost:3000](http://localhost:3000) - and see the home page being rendered by Express 4. - -

Upgrading to the Express 4 app generator

- -The command-line tool to generate an Express app is still - `express`, but to upgrade to the new version, you must uninstall - the Express 3 app generator and then install the new - `express-generator`. - -

Installing

- -If you already have the Express 3 app generator installed on your system, -you must uninstall it: - -```bash -$ npm uninstall -g express -``` -Depending on how your file and directory privileges are configured, -you might need to run this command with `sudo`. - -Now install the new generator: - -```bash -$ npm install -g express-generator -``` - -Depending on how your file and directory privileges are configured, -you might need to run this command with `sudo`. - -Now the `express` command on your system is updated to the -Express 4 generator. - -

Changes to the app generator

- -Command options and use largely remain the same, with the following exceptions: - -{: .doclist } -* Removed the `--sessions` option. -* Removed the `--jshtml` option. -* Added the `--hogan` option to support [Hogan.js](http://twitter.github.io/hogan.js/). - -

Example

- -Execute the following command to create an Express 4 app: - -```bash -$ express app4 -``` - -If you look at the contents of the `app4/app.js` file, you will notice -that all the middleware functions (except `express.static`) that are required for -the app are loaded as independent modules, and the `router` middleware -is no longer explicitly loaded in the app. - -You will also notice that the `app.js` file is now a Node.js module, in contrast to the standalone app that was generated by the old generator. - -After installing the dependencies, start the app by using the following command: - -```bash -$ npm start -``` - -If you look at the `npm start` script in the `package.json` file, -you will notice that the actual command that starts the app is -`node ./bin/www`, which used to be `node app.js` -in Express 3. - -Because the `app.js` file that was generated by the Express 4 generator -is now a Node.js module, it can no longer be started independently as an app -(unless you modify the code). The module must be loaded in a Node.js file -and started via the Node.js file. The Node.js file is `./bin/www` -in this case. - -Neither the `bin` directory nor the extensionless `www` -file is mandatory for creating an Express app or starting the app. They are -just suggestions made by the generator, so feel free to modify them to suit your -needs. - -To get rid of the `www` directory and keep things the "Express 3 way", -delete the line that says `module.exports = app;` at the end of the -`app.js` file, then paste the following code in its place: - -```js -app.set('port', process.env.PORT || 3000) - -var server = app.listen(app.get('port'), () => { - debug('Express server listening on port ' + server.address().port) -}) -``` - -Ensure that you load the `debug` module at the top of the `app.js` file by using the following code: - -```js -var debug = require('debug')('app4') -``` - -Next, change `"start": "node ./bin/www"` in the `package.json` file to `"start": "node app.js"`. - -You have now moved the functionality of `./bin/www` back to -`app.js`. This change is not recommended, but the exercise helps you -to understand how the `./bin/www` file works, and why the `app.js` file -no longer starts on its own.