我创建了一个简单的Node.js应用程序,但我无法设置任何路由。我收到以下错误:
/Users/rexhin/Desktop/Exercise Files/02_03/finished/node/routes/index.js:5
router.get('/', function(req, res) {
^
TypeError: Cannot read property 'get' of undefined
at Object.<anonymous> (/Users/rexhin/Desktop/Exercise Files/02_03/finished/node/routes/index.js:5:7)
at Module._compile (module.js:571:32)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/rexhin/Desktop/Exercise Files/02_03/finished/node/app.js:4:14)
at Module._compile (module.js:571:32)
我不知道这里的问题是什么,因为我已经包含了所有必需的模块。
我的档案是:
app.js
var express = require('express');
var routes = require('./routes/index');
var app = express();
app.use(routes);
/routes/index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
module.exports = router;
package.json
{
"name": "ExpressHello",
"version": "0.0.0",
"description": "Simple Express Application",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Rexhin",
"license": "ISC",
"dependencies": {
"express": "^3.5.1"
}
}
答案 0 :(得分:2)
应该是。 / * GET主页。 * /
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
//this the editted code below, you forgot the route functor.
router.route('/').get(function(req, res) {
res.render('index', { title: 'Express' });
});
您可以使用两种方式在Express +4.0中路由,使用var app = express()
中的app实例,它可以为主中间件应用程序(main)提供一个钩子,并且可以这种方式访问。
app.get('/example/a', function (req, res) {
res.send('Hello from A!')
});
或来自express.Router()的路由器实例,它用于更多单个本地化路由中间件(不是主应用程序)。
可以这种方式访问。
var router = express.Router();
router.route('route').get(function(req,res){});
router.route('route').post(function(req,res){});
但是你必须通过这样做返回路由器实例并附加到主app中间件,但是因为你返回了express.Router()的实例,你需要使用名称限定符限定中间件路由。
app.use('some_route',router);
虽然这是有效的。
// define the home page route
router.get('/', function (req, res) {
res.send('home page')
})
不推荐。
app.use(routes); //this line, i am guessing it is the imported module with the router.
试试这个。
app.use('/',routes);
路由器实例可能为null的另一个原因可能是您用于检索文件的路径。再次检查绝对路径,因为再次查看错误表明路由器不存在。
var routes = require('./routes/index'); is it valid ?
问题是您的3.5.1升级版本。执行npm uninstall express --save
然后npm install --save express
答案 1 :(得分:1)
您使用的是最新版的快递套餐吗?你能分享你的package.json的内容吗?
express.Router方法在express 4.x版本中添加。 如果您使用的是旧版本的express 3.x,那么express.Router方法可能会由另一个模块添加,该模块可能不会返回任何导致路由器变量未定义的模块。 / p>
答案 2 :(得分:1)
package.json
中的快递版本为^3.5.1
但由于某种原因npm
未下载Express ^4.x.x
,因此解决方法是删除node_modules文件夹,更新Express版本为^4.15.0
并再次运行npm install。