2015-03-26 11 views
8

Nie jestem pewien, ale myślę, że mam coś, co powinien działać, ale tak nie jest, a otrzymany błąd jest dość niepomocny.Węzeł zgłasza TypeError: Nie można odczytać właściwości "indexOf" o niezdefiniowanym

Więc próbuje wysłać przedmiot paszport do jednej z tras, które rozumieją powinny być po prostu ustawić

var users = require('./routes/users')(app, passport); 

Która zgłasza błąd przy starcie

> /Users/bengtbjorkberg/.nvm/versions/node/v0.12.0/bin/node app.js Test 
> something 2 
> /Users/bengtbjorkberg/WebstormProjects/goMinute/node_modules/express/lib/router/index.js:130 
> var search = 1 + req.url.indexOf('?'); 
>       ^TypeError: Cannot read property 'indexOf' of undefined 
>  at Function.proto.handle (/Users/bengtbjorkberg/WebstormProjects/goMinute/node_modules/express/lib/router/index.js:130:27) 
>  at router (/Users/bengtbjorkberg/WebstormProjects/goMinute/node_modules/express/lib/router/index.js:35:12) 
>  at Object.<anonymous> (/Users/bengtbjorkberg/WebstormProjects/goMinute/app.js:41:38) 
>  at Module._compile (module.js:460:26) 
>  at Object.Module._extensions..js (module.js:478:10) 
>  at Module.load (module.js:355:32) 
>  at Function.Module._load (module.js:310:12) 
>  at Function.Module.runMain (module.js:501:10) 
>  at startup (node.js:129:16) 
>  at node.js:814:3 
> 
> Process finished with exit code 1 

Jeśli usunąć aplikację i paszport, problem znika magicznie. trasy w ./routes/users nie używają jeszcze żadnego z nich.

zostały dodane niektóre kodu (usunął kawałek konfiguracji paszportu do dobrej kondycji)

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4) 
var stylus = require('stylus'); 
var nib = require('nib'); 
var morgan = require('morgan'); 

// express session and passport 
var session = require('express-session'); 
var passport = require('passport'); 
var flash = require('connect-flash'); 




var app = express(); 
function compile(str, path) { 
    return stylus(str) 
     .set('filename', path) 
     .use(nib()) 
} 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
var accesslevels = require('./config/accesslevels.js'); 
console.log("Test something " + accesslevels.userRoles.user); 
// required for passport 
app.use(session({ secret: '' + 'asifIwouldtellstackoverflowright', resave: true, saveUninitialized: true })); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 

//Routes after passports 
var routes = require('./routes/index'); 
var users = require('./routes/users')(app, passport); 
var loginsrv = require('./routes/login'); 
var api = require('./routes/api'); 
var partials = require('./routes/partials'); 

var auth = function(req, res, next) { 
    if (!req.isAuthenticated()) 
     res.send(401); 
    else 
     next(); 
    }; 
//See more at: https://vickev.com/#!/article/authentication-in-single-page-applications-node-js-passportjs-angularjs 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(bodyParser.json()); // get information from html forms 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 
app.use(require('stylus').middleware(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
app.use('/users', users); 
app.use('/partials', partials); 
app.use('/loginsrv', loginsrv); 

//app.use(accesslevels()); 

//console.log(accesslevels); 
// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 


module.exports = app; 
app.listen(30010); 

Edycja: Dodano trasy/users.js

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

/* GET users listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

/* 
// route to test if the user is logged in or not 
router.get('/loggedin', function(req, res) { 
    res.send(req.isAuthenticated() ? req.user : '0'); 
}); 

router.post('/login', passport.authenticate('local'), function(req, res) { 
    res.send(req.user); 
}); 

router.post('/logout', function(req, res){ 
    req.logOut(); 
    res.send(200); 
}); 
*/ 

module.exports = router; 

W powyższym kod mam zmienił oryginalny router.get('/', function(req, res, next) z router.get('/', function(app, passport, req, res, next), który rozwiązuje problem.

+0

Jaki jest zakres 'req'? –

+0

Co zawiera plik './Routes/users.js'? – mscdex

+0

mscdex, nic, mam jakiś kod, który planowałem uruchomić, ale w tej chwili jest on skomentowany (ponieważ potrzebuje obiektu paszportowego skonfigurowanego w głównej części węzła). – vrghost

Odpowiedz

0
app.get('/api',function(req,res) 
{ 
    if (req.url.indexOf('/api')==0) { 
     console.log('yes i have done it'); 
    } 
}); 

I wprowadziły to ja otrzymuję wyjście na console.What dzieje się w kodzie jest, że req jest undefined.So węzeł rzuca ten błąd ... Jak widać w moim kodu tylko możemy używaj tylko metody req.url.indexOf tylko wtedy, gdy jesteśmy w zakresie wymagań (tzn. musisz zadeklarować wyszukiwanie wewnątrz funkcji zwrotnej, która zajmuje się req, res .....)

+0

Bardzo dziękuję Harpreetowi Singhowi, mając problem z zrozumieniem dlaczego. Rozumiem, że odpowiedź jest niedostępna, nie mogę zrozumieć, dlaczego i gdzie nie jest ona dostępna. To znaczy. Wysyłam dwa obiekty do routera, aplikacji i paszportu. kiedy znajdą się w routerze, polecenie req nie jest dostępne. Czego nie mogę zrozumieć, dlaczego nie jest już dostępny lub dlaczego jest wywoływany tylko wtedy, gdy wysyłam te obiekty, nie zmieniam faktycznej trasy, trasa działa, gdy nie wysyłam obiektów? (Również, gdzie powinienem umieścić powyższy kod, umieścić go tuż przed faktycznymi trasami, a to nie zadziałało.) – vrghost

+0

w tym pliku utworzono obiekt routera za pomocą obiektu aplikacji.?. Nie rób tego tak "= –

+0

przepraszam za niewłaściwy komentarz powyżej var router = app.Router(); następnie zadeklaruj trasę, którą chcesz zaimplementować za pomocą router.get ('/ abc', function (req, res) {var search = req.url.indexOf ('?');) lub router.post ('/ abc' , function (req, res) {var search = req.url.indexOf (?"); }) –

1

Nie jestem pewien, rozumiem dlaczego, ale sztuczka polegała na zmianie oryginalnego router.get('/', function(req, res, next) z router.get('/', function(app, passport, req, res, next), który rozwiązuje problem. Nie ma pewności, dlaczego ekspres wymaga funkcji, która nie wykorzystuje przekazanego obiektu do paszportu i aplikacji, ale tak się wydaje.

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

    /* GET users listing. */ 
    router.get('/', function(app,passport, req, res, next) { 
     res.send('respond with a resource'); 
    }); 

    /* 
    // route to test if the user is logged in or not 
    router.get('/loggedin', function(req, res) { 
     res.send(req.isAuthenticated() ? req.user : '0'); 
    }); 

    router.post('/login', passport.authenticate('local'), function(req, res) { 
     res.send(req.user); 
    }); 

    router.post('/logout', function(req, res){ 
     req.logOut(); 
     res.send(200); 
    }); 
    */ 

    module.exports = router; 
2

Tylko w przypadku, jeśli masz jakiekolwiek HTTP trasy czasownik app.get ('/' ...) zostały wykorzystane po app.use (..), to dostanie ten błąd w Express4x.

Ref here

Powiązane problemy