Получить все документы от аутентифицированного пользователя (отношение OneToMany) - PullRequest
0 голосов
/ 18 июня 2020

Я учусь использовать mongoDB И ExpressJS путем создания Rest API, который я бы использовал с ReactJS.

Я всегда выбирал MySQL для управления моей базой данных, но база данных mongoDB не является реляционной, и мне все еще трудно понять.

Пример того, что я хочу сделать

Допустим, я создал блог и хотите получать все статьи от пользователя, вошедшего в систему с учетной записью.

Все эти операции управляются с помощью REST API и MongoDB.

Как создать отношения OneToMany между статьями и пользователь.

С MySQL мне просто нужно было указать ключ user_id для каждой статьи в таблице статей.

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

РЕДАКТИРОВАТЬ

Я что-то пробовал, это работает, но я не знаю, это правильный подход.

Co ntext:

Я создал REST API с NodeJS и ExpressJS.

API позволит пользователю организовать свои приложения для облегчения поиска job.

Пользователь должен создать учетную запись и войти в систему, чтобы воспользоваться всеми функциями приложения, поэтому общедоступная информация отсутствует.

Для регистрации и аутентификации пользователя я использую Паспорт JS, mongoConnect и ExpressSession

Для начала, пользовательская модель mongoDB

 const userSchema = mongoose.Schema({
      name: {
        type:String
      },
      email: { 
        type:String, 
        required:true, 
        unique:true
      },
      email_is_verified: {
        type:Boolean,
        default:false
      },
      password: { 
        type:String, 
      },
      referral_code : {
          type:String,
          default: function() {
              let hash = 0;
              for(let i=0; i < this.email.length; i++){
                  hash = this.email.charCodeAt(i) + ((hash << 5) - hash);
              }
            let res = (hash & 0x00ffffff).toString(16).toUpperCase();
            return "00000".substring(0, 6 - res.length) + res;         
          }
    },
    referred_by : {
        type: String,
        default:null
    },
    third_party_auth: [ThirdPartyProviderSchema],
        date: {
            type:Date,
            default: Date.now
        }
    },
    { strict: false }
  );

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

Модель Apply представляет собой заявку на вакансию, пока только название.

Чтобы создать отношение OneToMany, я добавляю поле User, которое относится к моей модели User

Функция для получения всех применений, поэтому я получаю идентификатор пользователя сеанса.

const applySchema = mongoose.Schema({
   title: { type:String, required:true },
   user: {
     type: mongoose.Schema.Types.ObjectId,
     ref: "User"
   }
})

module.exports = mongoose.model('Apply', applySchema);

Я создал контроллер для управления приложениями пользователя

exports.getAllApplies = (req, res, next) => {

  res.locals.currentUser = req.user;
  const userId = res.locals.currentUser.id

  Apply.find({ user:userId })
     .then(applies => res.status(200).json({ message:'success', 
         applies:applies }))
     .catch(error => res.status(400).json({ error:error, message: 'Failed'}))
}

Функция, позволяющая обращаться к приложению

exports.getOneApply = (req, res, next) => {
   res.locals.currentUser = req.user;
   const userId = res.locals.currentUser.id

   Apply.findOne({ _id:req.params.id, user:userId })
      .then(apply => res.status(200).json({ message: `Apply with id 
            ${apply._id} success`, apply:apply}))
      .catch(error => res.status(500).json({ error:error, message:'Failed'}))
 }

Маршруты моего api, я добавляю промежуточное ПО auth в разрешить запросы только y для пользователя с токеном

const express = require('express');
const router = express.Router();

const auth = require('../middleware/auth');
const applyCtrl = require('../controllers/apply');


router.get('/', auth, applyCtrl.getAllApplies);
router.get('/:id', auth, applyCtrl.getOneApply);

module.exports = router;

Прошу прощения за длину поста, если у вас есть вопросы, буду рад на них ответить.

Заранее благодарю за ваша помощь и ваши ответы.

...