Как вернуть текущую информацию пользователя из MongoDB в приложении стека MEVN - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать базовое приложение для входа / регистрации, используя Vue, Express, Node и MongoDB. Я успешно настроил маршрутизатор Express, чтобы разрешить регистрацию и вход в систему пользователей, при этом базовая информация о пользователях сохранена в MongoDB. Я пытаюсь вернуть пользовательские данные обратно на экран после входа в систему. До сих пор я настроил router.get() в Express, чтобы вернуть имя пользователя всех пользователей обратно на экран. Однако я хочу настроить метод axios.get() в Vue.js так, чтобы он возвращал только имя пользователя вошедшего в систему пользователя, а не все имена пользователей, хранящиеся в MongoDB. Обычно в Firebase я бы использовал что-то вроде let snapshot = await ref.where('userid', '==', firebase.auth().currentUser.uid).get(), чтобы отправить обратно информацию исключительно о текущем пользователе. Как мне настроить мой axios.get() метод для выполнения чего-то подобного? Мой код ниже:

залогиненая страница

<template>
  <b-row>
    <b-col cols="12">
      <h2>
        You are now logged in!
        <b-link @click="logout()">(Logout)</b-link>
      </h2>
      <table style="width:100%">
        <tr>
          <th>User Names</th>
        </tr>
        <tr v-for="user in users" :key="user._id">
          <td>{{ user.username }}</td>
        </tr>
      </table>
      <ul v-if="errors && errors.length">
        <li v-for="error of errors" :key="error._id">
          <b-alert show>{{error.message}}</b-alert>
        </li>
      </ul>
    </b-col>
  </b-row>
</template>

<script>

import axios from 'axios'

export default {
  name: 'BookList',
  data () {
    return {
      users: [],
      errors: []
    }
  },
  created () {
    axios.defaults.headers.common['Authorization'] = localStorage.getItem('jwtToken')
    axios.get(`http://localhost:3000/api/auth`)
      .then(response => {
        this.users = response.data
      })
    },
    methods: {
      logout () {
        localStorage.removeItem('jwtToken')
        this.$router.push({
          name: 'Login'
        })
      }
    }
  }
  </script>

GET-маршрут в Express

router.get('/', function(req, res) {
  User.find(function (err, products) {
    if (err) return next(err);
    res.json(products);
  });
});

User.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcryptjs');

var UserSchema = new Schema({
  username: {
        type: String,
        unique: true,
        required: true
    },
  password: {
        type: String,
        required: true
    }
});

UserSchema.pre('save', function (next) {
    var user = this;
    if (this.isModified('password') || this.isNew) {
        bcrypt.genSalt(10, function (err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(user.password, salt, null, function (err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                next();
            });
        });
    } else {
        return next();
    }
});

UserSchema.methods.comparePassword = function (passw, cb) {
    bcrypt.compare(passw, this.password, function (err, isMatch) {
        if (err) {
            return cb(err);
        }
        cb(null, isMatch);
    });
};

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

Зарегистрировать маршрут

router.post('/register', function(req, res) {
  if (!req.body.username || !req.body.password) {
    res.json({success: false, msg: 'Please pass username and password.'});
  } else {
    var newUser = new User({
      username: req.body.username,
      password: req.body.password
    });
    // save the user
    newUser.save(function(err) {
      if (err) {
        return res.json({success: false, msg: 'Username already exists.'});
      }
      res.json({success: true, msg: 'Successful created new user.'});
    });
  }
});

1 Ответ

1 голос
/ 11 октября 2019

Я предполагаю, что ваша модель пользователя имеет поля имени пользователя и пароля, а ваш пароль зашифрован в дБ.

Для поиска пользователя с именем пользователя, если пользователь обнаружил сравнение user.password с зашифрованным паролем в теле запроса,Если пользователь не найден или пароли не совпадают, я отправляю запрос 400-Bad.

const bcrypt = require("bcryptjs");
..
router.post('/', async (req, res) => {

    const { username, password } = req.body;

    if (!(username && password))
        return res.status(400).json({ error: "username and password are required" });

    try {

        let user = await User.findOne({ username });

        if (!user) return res.status(400).json({ error: "invalid login" });

        const validPassword = await bcrypt.compare(password, user.password);

        if (!validPassword) return res.status(400).json({ error: "invalid login" });

        user.password = undefined;

        res.json(user);

    } catch (err) {
        console.log(err);
        return next(err);
    }

});

Чтобы хешировать пароль перед сохранением пользователя, можете ли вы добавить этот код в модель пользователя?

UserSchema.pre('save', async function (next) {
    this.password = await bcrypt.hash(this.password, 12);
    next();
});

Регистрация маршрута:

router.post('/register', async (req, res) => {

    const { username, password } = req.body;

    if (!username || !password)
        return res.json({ success: false, msg: 'Please pass username and password.' });

    try {
        let user = await User.findOne({ username });

        if (user) return res.json({ success: false, msg: 'Username already exists.' });

        user = new User({ username, password });

        await user.save();

        res.json({ success: true, msg: 'Successful created new user.' });
    } catch (err) {
        console.log(err);
        res.json({ success: false, msg: 'Something went bad' });
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...