类型错误: 无法读取未定义属性 'push' - Express

30

我为nodejs应用程序编写了两个Javascript文件,其中使用express进行路由和创建服务器。由于我是初学者,所以不太了解它。 当我运行应用程序时,它显示以下错误:-

/usr/lib/node_modules/express/lib/router/index.js:472
    this.stack.push(layer);
              ^

TypeError: Cannot read property 'push' of undefined
    at Function.use (/usr/lib/node_modules/express/lib/router/index.js:472:15)
    at Object.<anonymous> (/home/dhiresh/Coding/angularjsapp/api.js:9:3)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/home/dhiresh/Coding/angularjsapp/index.js:2:7)

index.js文件如下:

var express = require('express'),
api = require('./api'),
app=express(); 

app
.use(express.static('./public'))
.use('/api',api)
.get('*',function (req,res) {
    res.sendfile('public/index.html');
}).listen(3000);

api.js 文件如下:

var express = require('express'),
 bourne = require('bourne'),
 bodyParser= require('body-parser'),

 db = new bourne('data.json'),

 router =express.Router(); 

 router
 .use(function(req,res,next){
    if(!req.user) req.user={ id:1 };
    next();
 })
 .use(bodyParser.json())
 .route('/contact')
 .get(function(req,res){
    db.find({userId : parseInt(req.user.id,10)},function(err,data){
        res.json(data);
    });
 })
 .post(function(req,res){
    var contact = req.body;
    contact.userId = req.user.id;

    db.insert(contact,function(err,data){
        res.json(data);
    });
 });

 router
 .param('id',function(req,res,next){
    req.dbQuery = { id:parseInt(req.params.id,10) }
 })
 .route('/contact/:id')
 .get(function(req,res){
    db.findOne(req.dbQuery,function(err,data){
        res.json(data);
    });
 })
 .put(function(req,res){
        var contact = req.body;
        delete contact.$promise;
        delete contact.$resolve;
        db.update(req.dbQuery,function(err,data){
        res.json(data[0]);
    })
    })
 .delete(function(req,res){
    db.delete(req.dbQuery,function(err,data){
        res.json(null);         
    })
 });

module.exports = router;

有人能告诉我这个问题的答案吗?


刚刚看到这个,源代码位于node_modules/express/lib/router/index.js:502 this.stack.push(layer); - bear
5个回答

87

我的问题是缺少括号:

const router = require('express').Router;

改为这样

const router = require('express').Router(); 

问题已解决。


3
实际上,这应该被接受,因为OP从未要求ES2017导入语法。 - Vijay Kumar Kanta

10

当您从Express模块导入Router并直接使用变量而不重新分配时,会发生此错误。

错误示例

import { Router as router} from express;

router.get('/', ( req, res) => {
  return res.send(req.context.models.users[req.context.me.id]);
});

这些不良代码可能以其他方式出现,但规则是不要直接使用路由器变量,重新分配它

好的代码

import { Router as expressRouter } from 'express';

const router = expressRouter();

router.get('/', (req, res) => {
  return res.send(req.context.models.users[req.context.me.id]);
});

OR

import { Router } from 'express';

const router = Router();

router.get('/', (req, res) => {
  return res.send(req.context.models.users[req.context.me.id]);
});

1
const experss = require('express');
const router = express.Router();

router.get('/', (req, res) => res.send('Root route'))

module.exports = router;

以上代码应该可以运行。

1
你能详细说明一下这个修复了作者的问题吗?没有任何解释就提供与问题似乎无关的代码片段是没有帮助的。如果你还没有参观过,请参观并使用帮助中心的指南改进你的答案。 - 3x071c

0

你有:

router = express.Router()

你应该使用const来声明变量:

const router = express.Router()

0

这个错误可能是以下几种情况之一。

解决方案1:

错误的导入方式:router = require('express').Router();

正确的导入方式:const router = require('express').Router(); 解释:如果你没有使用'const'关键字导入express模块的方法,就会产生这样的错误。

解决方案2:

错误的导入方式:const router = require('express').Router;

正确的导入方式:

const router = require('express').Router();
 Explanation: Importing the method Router without the parenthesis will also
 possibly generate such an error message

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接