Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodejs/Express routing with Passport returning undefined req.url

Tags:

node.js

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;
like image 746
Mahraan Qadir Avatar asked Oct 28 '25 03:10

Mahraan Qadir


1 Answers

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
    }))

})
like image 177
dparise Avatar answered Oct 30 '25 03:10

dparise



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!