Mon goose - Невозможно создать более 4 полей, используя `findOrCreate` - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Node.js, MongoDB с Пн goose и использую паспорт. js для аутентификации.

Вот моя схема пользователя:

const userSchema = new mongoose.Schema({
  email: String,
  password: String,
  googleId: String,
  facebookId: String,
  profilePic: String,
  fName: String,
  lName: String
});

И мой Стратегия Google:

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      callbackURL: "http://localhost:3000/auth/google/dashboard",
      profileFields: ["id", "displayName", "photos", "email"]
    },
    function(accessToken, refreshToken, profile, cb) {
      console.log(profile);
      console.log(profile.photos[0].value);
      User.findOrCreate(
        { googleId: profile.id },
        { profilePic: profile.photos[0].value },
        { email: profile.emails[0].value },

        function(err, user) {
          return cb(err, user);
        }
      );
    }
  )
);

Когда я console.log показываю свой результат, я вижу свой профиль вместе с URL-адресом фотографии профиля и адресом электронной почты профиля, но не могу увидеть свой идентификатор электронной почты. Создаются только 4 поля:

  • _id
  • googleId
  • profilePic
  • _v

Может кто-нибудь сказать мне, как получить поле электронной почты, чтобы сохранить?

1 Ответ

0 голосов
/ 27 февраля 2020

Почему у вас возникла проблема:
Вы плохо используете метод findOrCreate. findOrCreate может принимать до четырех аргументов.
findOrCreate(conditions, doc, options, callback):

  • conditions: используется для указания фильтра выбора для поиска документа.
  • doc [необязательно]: если документ, соответствующий фильтру выбора (conditions), не найден, этот doc объединяется с тем, что имеется в conditions, а затем вставляется в БД.
  • options [необязательно]: из базы кодов плагинов я решил, что вы можете использовать options.upsert (если установлено значение true), чтобы обновить документ, если он уже существует.
  • callback: функция, выполняемая после завершения операции.

То, что вы делаете неправильно, это пароль { email: profile.emails[0].value } в качестве третьего аргумента, где ожидается options, вы должны включить его в doc, то есть во второй аргумент.

Исправление
Попробуйте:

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      callbackURL: "http://localhost:3000/auth/google/dashboard",
      profileFields: ["id", "displayName", "photos", "email"]
    },
    function(accessToken, refreshToken, profile, cb) {
      console.log(profile);
      console.log(profile.photos[0].value);
      User.findOrCreate(
        { googleId: profile.id },
        // Notice that this function parameter below 
        // includes both the profilePic and email
        { profilePic: profile.photos[0].value, email: profile.emails[0].value },
        function(err, user) {
          return cb(err, user);
        }
      );
    }
  )
);
...