【问题标题】:nodeJS/Express TypeError : Cannot read property 'method' of undefinednodeJS/Express TypeError:无法读取未定义的属性“方法”
【发布时间】:2020-04-07 08:44:38
【问题描述】:

您好,我在尝试启动服务器时遇到错误。它是这样说的:

D:\Other\Projects\Code\Powershell\shopping-cart\node_modules\express\lib\router\index.js:139 debug('调度 %s %s', req.method, req.url); ^

TypeError: Cannot read property 'method' of undefined
    at Function.handle (D:\Other\Projects\Code\Powershell\shopping-cart\node_modules\express\lib\router\index.js:139:34)
    at router (D:\Other\Projects\Code\Powershell\shopping-cart\node_modules\express\lib\router\index.js:47:12)
    at Object.<anonymous> (D:\Other\Projects\Code\Powershell\shopping-cart\app.js:7:39)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (D:\Other\Projects\Code\Powershell\shopping-cart\bin\www:7:11)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47

我的 app.js 文件:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var routes = require('./routes/index')(passport);
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var expressHbs = require('express-handlebars');
var mongoose =require('mongoose');
var app = express();
var session = require('express-session');
var passport = require('passport');
var flash = require('connect-flash');
var bodyParser = require('body-parser');

mongoose.connect('mongodb://localhost:27017/shopping', {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.connection.on('error', err => {
  throw 'failed to connect to MongoDB';
});
require('D:/Other/Projects/Code/Powershell/shopping-cart/config/passport.js');



// view engine setup
app.engine('.hbs', expressHbs({defaultLayout: 'layout', extname:'.hbs'}))
app.set('view engine', '.hbs');

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({secret: 'mysupersecret', resave: false, saveUninitialized: false}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));



app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

还有我的 index.js 文件:

var express = require('express');
var router = express.Router();
var Product = require('D:/Other/Projects/Code/Powershell/shopping-cart/models/product');
var csrf = require('csurf');
//var passport = require('D:/Other/Projects/Code/Powershell/shopping-cart/config/passport.js');
var passport = require ('passport');
var csrfProtection = csrf();
router.use(csrfProtection);

/* GET home page. */
router.get('/', function(req, res, next) {
  Product.find(function(err, docs) {
    var productChunks = [];
    var chunkSize = 3;
    for (var i = 0; i < docs.length; i += chunkSize) {
           productChunks.push(docs.slice(i, i + chunkSize));
    }
    res.render('shop/index', { title: 'Shopping Cart', products: productChunks });
  });
});

router.get('/user/signup', function (req, res, next) {
   res.render('user/signup', {csrfToken: req.csrfToken()});
});

router.post('/user/signup', passport.authenticate('local.signup', {
  successRedirect: '/user/profile',
  failureRedirect: '/user/signup',
  failureFlash: true
}));

router.get('/user/profile', function(req, res, next) {
  res.render('user/profile');
});

module.exports = router;

关于可能是什么问题的任何提示?我检查了抛出的错误中提到的行,找不到任何损坏的内容,并且我还检查了有关此错误的其他问题,没有一个对我有帮助。任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 请首先,学习如何正确地构建你的项目,检查here和here,然后学习如何处理错误,这是非常重要的事情,因为它很难被发现javascript中的错误,希望这有帮助:)
  • 我认为这是问题所在 var csrfProtection = csrf(); 尝试将其更改为 var csrfProtection = csrf({ cookie: true });
  • @AniEmmanuelArinzechukwu 改变了它但仍然抛出同样的错误:(

标签: node.js express


【解决方案1】:

从堆栈跟踪来看,问题似乎是由这一行引起的:

var routes = require('./routes/index')(passport);

如果您查看您的routes/index.js,您正在导出一个router:

module.exports = router;

嗯,问题是你不能打电话给router(passport)。这不是使用路由器的合法方式。我不知道你到底想做什么。我假设您想通过以下方式将您的路线连接到应用程序中:

app.use(routes)

但是,也许你有其他意图。无论如何,router(passport) 不是你能做的。


仅供参考,学习如何阅读这些堆栈跟踪是一项非常有用的技能。您通常希望从堆栈跟踪的顶部开始并逐行向下,直到找到您自己的源文件中的一行代码(触发此操作的代码)。然后,根据最终错误的上下文检查该确切行,然后看看您是否可以看到该行代码或该行代码中使用的参数有什么问题。

【讨论】:

  • 这是我在阅读其他问题后添加的一行,这对提出问题的人有所帮助。删除它,现在它可以工作了,谢谢!!
  • @IceColdForums - 是的,不应该添加这样的东西,除非你真的了解它们的双方。该结构仅在您导出一个期望 passport 传递给它的函数时使用,而不是在导出路由器时使用。
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2022-09-23
  • 2022-11-29
  • 2017-08-30
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多