passport logout () ошибка: сбой приведения к ObjectId для значения «logout» по пути «_id» для модели «somemodel (не модель пользователя)» - PullRequest
0 голосов
/ 23 октября 2018

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

, когда я вхожу в маршрут выхода из системы, он выдает ошибку: Cast to ObjectId failed for value "logout" at path "_id" for model "Spot"

Я пробовал версию 4.7.2 для mongoose, она не работает.Я не могу себе представить, почему он вообще связывает мой маршрут выхода с точечной моделью.

my app.js

    var express             = require("express"),
    bodyParser          = require("body-parser"),
    mongoose            = require("mongoose"),
    passport            = require("passport"),
    passportFacebook    = require("passport-facebook").Strategy,
    User                = require("./models/user.js"),
    Spot                = require("./models/spot.js");

mongoose.connect("mongodb://localhost/biketrialspots", { useNewUrlParser: true });

var app = express();
app.set("view engine","ejs");
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.static('public'));
app.use(require("express-session")({
    secret: "some secret",
    resave: false,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());

app.use(function(req, res, next){
   res.locals.currentUser = req.user;
   next();
});

passport.use(new passportFacebook({
    clientID: "some id",
    clientSecret: "some secret",
    callbackURL: "somewebsite/auth/facebook/callback",
    profileFields: ['id', 'displayName', 'picture.type(large)']
}, function(accessToken, refreshToken, profile, done) {

        User.findOrCreate(profile, function(err, user) {

             if (err) 
                { return done(err); }

            done(null, user);

        });
    }
));

passport.serializeUser(function(user, done) {
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

app.get("/", function(req, res){
    Spot.find({}, function(err, spots){
        if(err){
            console.log(err);
        } else{
            res.render("index", {spots:spots});
        }
    });
});

app.get("/new", ensureAuthenticated, function(req, res){
    res.render("new");
});

app.post("/", function(req, res){
    Spot.create(req.body.spot, function(err, result){
        if(err){
            console.log(err);
        } else{
            res.redirect("/");
        }
    });
});

app.get("/:id", function(req, res){
    Spot.findById(req.params.id, function(err, spot){
        if(err){
            console.log(err);
        } else{
            res.render("spot", {spot: spot});
        }
    });
});

// Redirect the user to Facebook for authentication.  When complete,
// Facebook will redirect the user back to the application at
//     /auth/facebook/callback
app.get('/auth/facebook', passport.authenticate('facebook'));

// Facebook will redirect the user to this URL after approval.  Finish the
// authentication process by attempting to obtain an access token.  If
// access was granted, the user will be logged in.  Otherwise,
// authentication has failed.
app.get('/auth/facebook/callback',
  passport.authenticate('facebook', { successRedirect: '/',
                                      failureRedirect: '/login' }));

app.get("/logout", function(req, res){

    req.user.logout();
        res.redirect('/'); 


});

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    return res.redirect('/');
}

app.listen(process.env.PORT, process.env.IP, function(req, res){
    console.log("APP HAS STARTED!!!!!");
});

модель пользователя

var mongoose = require("mongoose");

var userSchema = new mongoose.Schema({
    facebookID:Number,
    username:String,
    photo:String
});

userSchema.statics.findOrCreate = function findOrCreate(profile, cb){
    var userObj = new this();
    this.findOne({facebookID : profile.id},function(err,result){ 
        if(!result){
            userObj.facebookID = profile.id;
            userObj.username = profile.displayName;
            userObj.photo = profile.photos[0].value;
            userObj.save(cb);
        } else{
            cb(err,result);
        }
    });
};

module.exports = mongoose.model("User", userSchema);

СпасибоВы

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку app.get("/:id", ...) записано в вашем коде до app.get("/logout", ...), я думаю, что обработчик запроса /:id будет вызван, когда вы получите /logout.Затем req.params.id становится "logout", и ошибка выдается Spot.findById().

Как насчет попытки написать app.get("/logout", ...) до app.get("/:id", ...)?

...