Ответы пользователя по тегу MongoDB
  • Как связать таблицы через Mongoose?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Нужно использовать метод populate
    Ответ написан
    1 комментарий
  • Как найти учителя JS и Node.js?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    В тему про codementor.io (ссылка, почему-то неправильно вставляется)
    https://www.codementor.io/experts?q=nodejs&lang=russian
    Ответ написан
    Комментировать
  • Как найти преподавателя по Node.js?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как уже писал не раз тут на тостере - начните с codementor.io (поиском node.js и russian). Там ставка выше, но я думаю сможете договориться.

    P.S. в целом же, менторов на русском языке найти очень не просто.
    Ответ написан
  • Какие данные необходимо записывать в jwt (node.js + mongo)?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Логин класть в токен не нужно. В токене не должно быть "личной информации", а вот ObjectId уже можно. Это не подходит "под личную", так как по 5821d94dbb021a1360582da3 нельзя узнать что-то о пользователе, если у вас не своровали базу (могу ошибаться).

    Приведу на всякий случай полный код роута с выдачей токена, если вам не особо пригодится, так может кто поругает, так как в бэкэнде не силен. Код не на промисах, а на коллбэках (как в древние времена). Это плохо. С помощью промисов будет "более плоский" и удобный в поддержке код.

    const express = require('express')
    const router = express.Router()
    const User = require('../models/user')
    const v4 = require('node-uuid').v4
    const jwt = require('jsonwebtoken')
    
    router.post('/signup', (req, res, next) => {
    
      req.check('email', 'Please enter a valid email').len(1).isEmail()
      req.check('password', 'Please enter a password with a length between 4 and 34 digits').len(4, 34)
    
      const errors = req.validationErrors()
    
      if (errors) {
        return res.status(400).json({ errors })
      } else {
        User.hashPassword(req.body.password, (err, passwordHash) => {
          if (err) {
            return res.status(400).json({ error: err.message })
          }
    
          const user = new User({
            name: req.body.name,
            nickname: req.body.nickname,
            email: req.body.email,
            password: req.body.password,
          })
    
          user.passwordHash = passwordHash
          user.save((err, item) => {
            if (err) {
              return res.status(400).json({ error: err.message })
            }
            const payload = {
              _id: item._id,
              iss: 'http://localhost:3000',
              permissions: 'poll',
            }
            const options = {
              expiresIn: '7d',
              jwtid: v4(),
            }
            const secret = new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64')
            jwt.sign(payload, secret, options, (err, token) => {
              return res.json({ data: token })
            })
          })
        })
      }
    })
    
    router.post('/signin', (req, res, next) => {
    
      req.check('email', 'Please enter a valid email').len(1).isEmail()
      req.check('password', 'Please enter a password with a length between 4 and 34 digits').len(4, 34)
    
      const errors = req.validationErrors()
      const password = req.body.password
    
      if (errors) {
        return res.status(400).json({ errors })
      } else {
        User.findOne({ email: req.body.email }, (err, user) => {
          if (err) {
            return res.status(400).json({ error: err.message })
          }
          if (!user) {
            return res.status(400).json({ error: 'User not found' })
          }
          User.comparePasswordAndHash(password, user.passwordHash, (err, areEqual) => {
            if (err) {
              return res.status(400).json({ error: err.message })
            }
            if (!areEqual) {
              return res.status(400).json({ error: 'Wrong password' })
            }
            const payload = {
              _id: user._id,
              iss: 'http://localhost:3000',
              permissions: 'poll',
            }
            const options = {
              expiresIn: '7d',
              jwtid: v4(),
            }
            const secret = new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64')
            jwt.sign(payload, secret, options, (err, token) => {
              return res.json({ data: token })
            })
          })
        })
      }
    })
    
    module.exports = router;


    В дальнейшем, кусочек payload:
    const payload = {
              _id: item._id,
              iss: 'http://localhost:3000',
              permissions: 'poll',
            }

    можно "декодировать" прямо на клиенте, что очень удобно.
    Ответ написан
    Комментировать
  • Как обновить массив вложенных документов в MongoDB?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    function deleteCategory(req, res, next) {
        model.CategoryModel.findByIdAndUpdate(req.params.id, { isDeleted: true }, function(err, category) {
            if (err) return next(err);
    
            category.image.forEach(item => {
              item.isDeleted = true
            })
    
            category.isDeleted = true/false // что вам тут нужно
    
            category.markModified('image') //http://mongoosejs.com/docs/faq.html
    
            model.CategoryModel.save((err, updatedItem) => {
              if (err) {
                return res.status(400).json({ message: err.message })
              } else {
                return res.json({ message: "Категория успешно удалена" })
              }
            })
        });
    }
    Ответ написан
    6 комментариев
  • Как получить данные из Redux State?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Если у вас есть данные в props - то просто отрисовывайте их в render функции (через this.props.filterState).
    Так как ваш компонент "присоединен" (с помощью connect), значит у вас всегда будут актуальные props.
    Props изменились - вызвается render (по логике работы react) => все отрисовано будет с актуальными данными.
    Ответ написан
    Комментировать