nodeJS / Express TypeError: Невозможно прочитать свойство 'method' из undefined - PullRequest
0 голосов
/ 07 апреля 2020

Здравствуйте, я получаю сообщение об ошибке при попытке запустить мой сервер. Вот что написано:

D: \ Other \ Projects \ Code \ Powershell \ shopping-cart \ node_modules \ express \ lib \ router \ index. js: отладка 139 ('отправка% 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

Мое приложение. 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;

И мой индекс. 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;

Любые намеки на то, что может быть проблемой? Я проверил строки, которые упоминаются в брошенной ошибке, и не могу найти ничего, что сломано, и я также проверил другие вопросы по этой ошибке, ни один, который помог мне. Любая помощь приветствуется, спасибо!

1 Ответ

1 голос
/ 07 апреля 2020

Из трассировки стека, похоже, проблема вызвана этой строкой:

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

Если вы посмотрите в routes/index.js, вы экспортируете router с:

module.exports = router;

Ну, проблема в том, что вы не можете позвонить router(passport). Это не ле 1018 * способ использования маршрутизатора. Я не могу сказать, что вы действительно пытались сделать с этим. Я бы предположил, что вы хотите подключить свои маршруты в приложение с помощью чего-то вроде:

app.use(routes)

Но, может быть, у вас там было какое-то другое намерение. В любом случае, router(passport) это не то, что вы можете сделать.


К вашему сведению, это очень полезный навык, чтобы научиться читать эти следы стека. Обычно вы стремитесь начать с верхней части трассировки стека и go вниз за строкой, пока не найдете строку кода, которая находится в вашем собственном исходном файле (ваш код, который это вызвал). Затем go исследует эту точную строку с контекстом возможной ошибки и определяет, можете ли вы увидеть, что не так с этой строкой кода или с параметрами, используемыми в этой строке кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...