Nœud jette TypeError: Cannot read property 'indexOf' undefined
Pas certain, mais je pense avoir quelque chose qui DEVRAIT fonctionner, mais il ne le fait pas, et le message d'erreur que j'obtiens est tout à fait inutile.
Si, en essayant d'envoyer le passeport d'objet de l'un des itinéraires, je comprends devrait être juste pour définir
var users = require('./routes/users')(app, passport);
Qui jette un défaut au démarrage
> /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
Si je retirer de l'app et de passeport, le problème disparaît comme par magie. les tracés ./routes/les utilisateurs de ne pas utiliser l'un d'eux encore.
J'ai ajouté une partie du code (a enlevé un peu de passeport de configuration pour la bonne forme)
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);
EDIT: Ajouté routes/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;
Dans le code ci-dessus, j'ai changé l'original router.get('/', function(req, res, next)
avec router.get('/', function(app, passport, req, res, next)
ce qui résout le problème.
req
?Ce n'
./routes/users.js
contenir?mscdex, rien, avoir un peu de code, j'avais l'intention de s'exécuter, mais il est commenté en ce moment (car elle a besoin de passeport objet configuré dans le nœud principal de la partie).
PM, autant que je sache, le champ d'application de
require
serait mondial, pense que c'est une partie de node.js lui-même (peut-être tort), je suis assez certain que je ne change pas de valeur par défaut.
OriginalL'auteur vrghost | 2015-03-26
Vous devez vous connecter pour publier un commentaire.
Juste au cas où, si vous avez un verbe HTTP routes app.get('/' ...) a été utilisé après l'application.utilisation (..), puis vous obtiendrez cette erreur dans Express4x.
Ref ici
OriginalL'auteur Senthil
Je ne suis pas certain que je comprends pourquoi, mais le truc était de changé l'original
router.get('/', function(req, res, next)
avecrouter.get('/', function(app, passport, req, res, next)
ce qui résout le problème. Pas pourquoi certaines express nécessite une fonction qui n'utilise pas l'objet passé en possession d'un passeport et d'application, mais il ne semble.OriginalL'auteur vrghost
j'Ai mis en œuvre la présente ,je m l'obtention de la sortie sur la console.Ce qui se Passe dans votre code, c'est qu'req n'est pas défini.Si le nœud est en train de lancer cette erreur...Comme vous pouvez le voir dans mon code, nous pouvons seulement utiliser req.url.méthode indexOf seulement lorsque nous sommes dans le champ d'application de la req.(j'.e vous devez déclarer la recherche à l'intérieur de la fonction de rappel de la poignée de req,res..... )
dans ce fichier que vous avez créé routeur objet à l'aide de l'app de l'objet.?si ce n'est pas comme ceci '=
désolé pour les mauvaises commentaire ci-dessus var routeur = app.Routeur(); puis de déclarer le parcours que vous souhaitez mettre en œuvre à l'aide du routeur.get('/abc',function(req,res){ var recherche =req.url.indexOf('?');) ou routeur.post('/abc',function(req,res){ var recherche =req.url.indexOf('?'); })
Je suis en train de faire le tri routes/users.js (ajouté à la question ci-dessus). Jusqu'à présent, je suis en fait pas appel app à tous, le problème se produit dès que j'essaie de passer de l'objet. Si je ne passe pas de l'objet (c'est à dire
var users = require('./routes/users');
plutôt quevar users = require('./routes/users')(app, passport);
tout fonctionne. (Actuellement, tous les les fonctions dans les utilisateurs d'un routeur à l'aide de l'app et le passeport sont commentés). Donc il semble que c'est la loi du passage de l'objet à l'aide de besoin qui est à l'origine express de rapport^ TypeError: Cannot read property 'indexOf' of undefined
Quel est donc le problème résolu? Je ne comprends pas...
OriginalL'auteur Harpreet Singh