Node.js Express无法使用路由

时间:2017-03-03 02:41:29

标签: javascript node.js express

我创建了一个简单的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"
  }
}

3 个答案:

答案 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。