I'm having some trouble with integrating PassportJS - I keep getting an error where a req.url is undefined. I think it has to do with how I'm routing my files, but I have no idea why. This is the error I'm getting, and it occurs when I add passport to my route:
/Users/Mahraan/this_project/node_modules/express/lib/router/index.js:128
var search = 1 + req.url.indexOf('?');
^
TypeError: Cannot read property 'indexOf' of undefined
at Function.proto.handle (/Users/Mahraan/this_project/node_modules/express/lib/router/index.js:128:27)
at router (/Users/Mahraan/this_project/node_modules/express/lib/router/index.js:34:12)
at module.exports (/Users/Mahraan/this_project/router/index.js:5:53)
at Object.<anonymous> (/Users/Mahraan/this_project/server.js:33:20)
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)
I've narrowed it down to the files below, but I'm not sure what I need to change to get it to work.
Below are the relevant files
file structure
- node_modules
- config
---- passport.js
-public
---- css
---- js
- router
---- routes
-------- app-login.js
-------- (+1 file for each route in the project)
---- index.js
- views
---- pages
-------- app-login.ejs
-------- (+1 file for each route in the project)
server.js
package.json
server.js
var express = require("express");
var passport = require('passport');
var flash = require('connect-flash');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var app = express();
var passport_config = require('./config/passport')(passport);
var port = process.env.PORT || 8080
var ip = process.env.IP || 'localhost'
app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser());
app.set("view engine", "ejs");
app.use(express.static(__dirname + "/public"));
// passport
app.use(session({ secret: 'supersecret' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
require('./router')(app, passport);
app.listen(port, ip, function() {
console.log("Listening on http://" + ip + ":" + port + "/app");
});
router/index.js
module.exports = function(app, passport){
// gives me the error
// app.use("/app/", require("./routes/app-login")(passport));
// works great
app.use("/app/", require("./routes/app-login"));
}
router/routes/app-login.js
var express = require("express");
var router = express.Router();
router.get("/", function(req, res){
res.render("pages/app/app-login");
});
// what I want to implement
// router.post('/', passport.authenticate("login", function(req, res) {
// do stuff
// }));
module.exports = router;
If you wanna call the value of require() as a function like you do in router/index.js, you need to write module.exports as a function that takes the argument you wanna pass.
So for router/routes/app-login.js, you need:
var express = require("express");
var router = express.Router();
module.exports = function (passport) {
router.post('/', passport.authenticate("login", function(req, res) {
// do stuff
}))
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With