节点猫鼬总是在 findOne 上返回错误

Posted

技术标签:

【中文标题】节点猫鼬总是在 findOne 上返回错误【英文标题】:Node mongoose always returning error on findOne 【发布时间】:2015-08-28 08:07:43 【问题描述】:

我正在使用 passport.js 登录用户,每当我的本地身份验证函数到达 User.findOne() 时,它总是返回错误。我不知道我做错了什么......

通过 findOne() 调用我的护照代码:

passport.serializeUser(function(user, done) 
    console.log('serialize user occurred');
    done(null, user.id);
);

// used to deserialize the user
passport.deserializeUser(function(id, done) 
    User.findById(id, function(err, user) 
        done(err, user);
    );
);




passport.use('local-signup',
    new LocalStrategy(
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password'
    ,
    function(email, password, done) 

        // asynchronous
        // User.findOne wont fire unless data is sent back
        process.nextTick(function() 
            // find a user whose email is the same as the forms email
            // we are checking to see if the user trying to login already exists
            User.findOne( 'local.email' :  email , function(err, user) 
                if (err) // An error occurred
                    console.log(err);
                    err.toString();
                    return done(err);
                if (user)  // This email is already in use
                    return done(null, false);
                 else  // Valid email to sign in wth
                    var newUser = new User();
                    newUser.local.email = email;
                    newUser.local.password = newUser.generateHash(password);

                    newUser.save(function(err) 
                        if (err)
                            throw err;
                        return done(null, newUser);
                    );
                
            );
        );
    )
);

还有我的用户模型:

var userSchema = mongoose.Schema(
    local : 
        email : String,
        password : String
    ,
    facebook : 
        id : String,
        token : String,
        email : String,
        name : String
    
);

// methods ==============
// Generate a hash for a password
userSchema.methods.generateHash = function(password)
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
;

// Checking if password is valid
userSchema.methods.comparePassword = function(password)
    return bcrypt.compareSync(password, this.local.password);
;

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

如果您有兴趣,还有我的路线:

app.get('/signupfail', function(req, res) 
    // render the page and pass in any flash data if it exists
    res.json(message: "failed to sign in, failure redirect");
);

// process the signup form
app.post('/signup', passport.authenticate('local-signup', 
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signupfail', // redirect back to the signup page if there is an error
    falureFlash : true // allow flash messages
));

app.get('/profile', isLoggedIn, function(req, res) 
    var user = req.user // This is the user extracted from the session
    res.json(message: "hooray it worked for: "+user.local.email);
);

说实话,我对节点很糟糕,但我想学习!

【问题讨论】:

控制台打印的错误是什么? 不幸的是,它不会向控制台打印任何内容,因为它是线程的(外部函数在日志之前完成),但是,通过使用 err.toString(),我可以猜到err === null 因为 err.toString() 抛出一个错误,说你不能在 null 上调用 toString() 。也许这是一个糟糕的假设。有什么建议吗? 【参考方案1】:
passport.use('local-signup',
 ...
    function(req, email, password, done) 

该函数需要三个参数email, password,done。 将回调函数改为

function( email, password, done) 

【讨论】:

我改了,还是不行。顺便说一句,我知道我不是专家,但我有 4 个参数,因为我将 'passReqToCallback' 设置为 true,但我没有使用它,所以无论如何,摆脱它并进行更改是个好主意还有 很抱歉,我之前从未使用过passReqToCallback 不用担心,您知道为什么我的问题被否决了吗?我不确定我的问题有多糟糕【参考方案2】:

嗯,我发现了问题。

听着孩子们,总是把你的 jimmy 包起来,总是把你的 if 语句关闭

【讨论】:

if (err) // 发生错误 console.log(err); err.toString(); return done(err);// 在这里?我的天……我也没见过。也许用 webstorm 之类的 ide 开发并经常格式化我们的代码是个好主意。

以上是关于节点猫鼬总是在 findOne 上返回错误的主要内容,如果未能解决你的问题,请参考以下文章

节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上

猫鼬 findOne 方法返回 null

MongoJS 节点 findOne 错误地返回无结果

猫鼬我如何返回 findOne 数据对象

猫鼬中的 findOne 返回空对象,然后返回正确的对象

猫鼬 findOne,更新和执行