【问题标题】:ValidationError: Validation failed mongooseValidationError:验证失败猫鼬
【发布时间】:2016-02-14 21:56:33
【问题描述】:

您好,我正在尝试将 Node.js 与 Facebook 连接起来。我正在关注this 博客条目。 有人能帮我吗?

我遇到了这个错误:

ValidationError:model.Document.invalidate 验证失败 (/Users/me/node_modules/mongoose/lib/document.js:1009:32)在 /Users/me/node_modules/mongoose/lib/document.js:958:16 在验证 (/Users/me/node_modules/mongoose/lib/schematype.js:610:7) 在 /Users/me/node_modules/mongoose/lib/schematype.js:627:9 在 SchemaString.SchemaType.doValidate 中的 Array.forEach(本机) (/Users/me/node_modules/mongoose/lib/schematype.js:614:19)在 /Users/me/node_modules/mongoose/lib/document.js:956:9 在 doNTCallback0 (node.js:419:9) 在 process._tickCallback (node.js:348:13)

 var FacebookStrategy = require('passport-facebook').Strategy;
    var BearerStrategy  = require('passport-http-bearer').Strategy;
    var passport = require('passport');
    var mongoose = require('mongoose');
    var ObjectId = require('mongoose').Types.ObjectId;

    // Mongoose connection to MongoDB (ted/ted is readonly)
    mongoose.connect('mongodb://localhost/testDB', function(error) {
        if (error) {
            console.log(error);
        }
    });

    var userSchema = new Schema({
        facebookId: String,
        access_token: {
                type: String
            },
        profileImage : String,
        email : {
            type : String,

            unique : true
        },
        password : {
            type : String,

        },
        created_at : Date,
        updated_at : Date
    });


        userSchema.statics.findOrCreate = function(filters, cb) {
            User = this;
            this.find(filters, function(err, results) {
                if(results.length == 0) {
                    var newUser = new User();
                    newUser.facebookId = filters.facebookId;
                    newUser.save(function(err, doc) {
                        cb(err, doc);
                    });
                } else {
                    cb(err, results[0]);
                }
            });
        };

    //facebook auth setup
        options = {
             clientID: 'FB_ID',
     clientSecret: 'FB_SecretKey',
     callbackURL: 'http://localhost:3000/auth/facebook/callback'

        };
     passport.use(
            new FacebookStrategy(
                options,
                function(accessToken, refreshToken, profile, done) {
                    User.findOrCreate(
                        { facebookId: profile.id },
                        function (err, result) {
                            if(result) {
                                result.access_token = accessToken;
                                result.save(function(err, doc) {
                                    done(err, doc);
                                });
                            } else {
                                done(err, result);
                            }
                        }
                    );
                }
            )
        );

        app.get(
            '/auth/facebook',
            passport.authenticate('facebook', { session: false, scope: [] })
        );

         app.get('/auth/facebook/callback',
            passport.authenticate('facebook', { session: false, failureRedirect: "/" }),
            function(req, res) {
                res.redirect("/");
            }
        );

        //token auth setup
        passport.use(
            new BearerStrategy(
                function(token, done) {
                    User.findOne({ access_token: token },
                        function(err, user) {
                            if(err) {
                                return done(err);
                            }
                            if(!user) {
                                return done(null, false);
                            }

                            return done(null, user, { scope: 'all' });
                        }
                    );
                }
            )
        );

package.json

{
  "name": "testapp",
  "version": "0.0.0",
  "description" : "Something"

  "engines": {
    "node": "4.2.x",
    "npm": "3.3.x",
  },
  "dependencies": {
    "body-parser": "~1.12.0",
    "cookie-parser": "~1.3.4",
    "debug": "~2.1.1",
    "express": "~4.12.2",
    "fs-extra": "^0.18.4",
    "jade": "~1.9.2",
    "jsonwebtoken": "5.0.4",
    "morgan": "~1.5.1",
    "multer": "^1.0.3",
    "serve-favicon": "~2.2.0"
  }
}

现在我更改了必填字段,但没有收到错误消息。

【问题讨论】:

  • mongodb shell server 启动了吗?
  • 是的,我做到了。否则我会得到一个我已经实现的异常。
  • 当您收到Validation failed 时,这意味着您正在尝试保存与您的架构不匹配的内容。您保存任何内容的唯一位置(在此代码中)是 Facebook 策略中的profile.id。它可能不是字符串。
  • 是的,我得到一个这样的数字:10404282581118299。我在我的模式中将类型更改为 number 和 schmema.mixed 但它似乎是相同的验证问题。我还打印 profile.id 的类型 console.log(typeof(profile.id)+ "profileID");它是一个字符串。
  • 哦,我明白了。您有电子邮件和密码作为必填字段,但您正在创建一个只有 profile.id 的新用户

标签: node.js mongodb mongoose oauth-2.0 passport.js


【解决方案1】:
password : {
        type : String, // <-- no 

    }

这可能是一个原因

【讨论】:

  • 我认为这会导致语法错误,而不是 OP 看到的验证失败错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2016-09-23
  • 1970-01-01
  • 2017-01-16
  • 2018-06-19
  • 2020-03-26
相关资源
最近更新 更多