Nodejs 发现express4.x里routes(app)不能用了?

Nodejs 发现express4.x里routes(app)不能用了?

我用的express是4.2.0 启动app.js 他官方的例子是(可以运行): <code> var routes = require(’./routes/index’); var app = express(); app.use(’/’, routes); </code> 我修改后: <code> var routes = require(’./routes’); var app = express(); routes(app); </code> 如果按官方这样写,如果文件很多的时候,app.js不是变得很臃肿吗? 我执行<code>node app.js</code>直接报错"TypeError: Cannot call method ‘toLowerCase’ of undefined"


5 回复

Nodejs 发现express4.x里routes(app)不能用了?

在Express 4.x版本中,路由的处理方式与之前的版本有所不同。你遇到的问题是因为Express 4.x不再支持直接通过routes(app)的方式将路由应用到应用实例上。

问题描述

在Express 3.x中,你可以这样做:

// routes/index.js
exports.index = function(req, res){
  res.send('Hello World');
};

然后在你的主应用文件中(例如app.js):

// app.js
var routes = require('./routes/index');
var app = express();

app.get('/', routes.index);

但是,在Express 4.x中,这种写法已经被弃用。你需要使用更现代的方式来定义和使用路由。

解决方案

在Express 4.x中,推荐的做法是使用router对象来组织和管理路由。你可以创建一个单独的路由文件,并将其挂载到应用实例上。

步骤1: 创建一个路由文件,例如routes/index.js

// routes/index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.send('Hello World');
});

module.exports = router;

步骤2: 在你的主应用文件app.js中引入并挂载这个路由:

// app.js
var express = require('express');
var app = express();

// 引入路由模块
var index = require('./routes/index');

// 挂载路由
app.use('/', index);

// 启动应用
app.listen(3000, function() {
  console.log('App is running on port 3000');
});

这种方式不仅保持了代码的整洁性,而且使得每个路由模块更加独立和易于维护。

总结

Express 4.x中的路由系统已经进行了重构,建议使用router对象来定义路由。这不仅符合最新的最佳实践,还可以让你的应用代码更加清晰和易于扩展。


官方写法不臃肿啊,现在讲router这个中间件独立出来后,好用多了,而且这种写法app.js不会臃肿啊。具体可以阅读: http://lostjs.com/2014/04/24/router-in-express-4/

然后,话说,你修改后的代码是有误的吧。补充一句,现在express4.x的启动方式不是node app.js了,是npm start,或者可以说等于是node ./bin/www

应该是 var routes = require(’./routes/index’); var app = express(); app.use(routes);//把routes对象传给express 然后在index.js中有 var express=require(‘express’); var routes=express.Router();//从express中取出routes对象 routes.get(’/’,function(req,res){ });

官方的只是个例子,其实有多种解决办法: 1)模块方法,简单易用 2)express-namespace等开源模块管理

在Express 4.x版本中,routes(app)这种写法已经不再适用了。现在推荐的做法是使用中间件(middleware)来定义路由。

在Express 3.x及更早版本中,你可以直接将路由函数传递给app.use(),这可能会导致误解或误用。在Express 4.x中,路由应该被定义为单独的模块,并且需要通过中间件的方式挂载到应用上。

示例代码

文件结构

假设你的文件结构如下:

- app.js
- routes/
  - index.js

index.js (路由文件)

// routes/index.js
var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
  res.send('Hello World!');
});

module.exports = router;

app.js (主应用文件)

// app.js
var express = require('express');
var app = express();

// 引入路由模块
var index = require('./routes/index');

// 将路由挂载到应用
app.use('/', index);

app.listen(3000, function () {
  console.log('App is listening on port 3000!');
});

解释

  1. index.js 定义了一个路由处理程序,该程序通过express.Router()创建。
  2. app.js中,我们引入了这个路由处理程序并将其挂载到应用上。app.use('/', index); 这行代码将index路由模块挂载到了应用的根路径/

这种方式的好处是你可以将不同的路由逻辑分散到不同的文件中,从而保持app.js的简洁性,避免臃肿。

如果你尝试使用routes(app)的方式,Express会期望routes返回一个函数或者符合某些特定格式的对象,而不再是直接调用routes(app)。上述示例展示了如何正确地使用Express 4.x中的路由功能。

回到顶部