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"
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等开源模块管理