Объект продолжает показывать пароль, который я пытаюсь скрыть

#javascript #mongodb #mongoose #passwords

#javascript #mongodb #мангуст #пароли

Вопрос:

Итак, я пытаюсь скрыть объект пароля от отображения. Вот мой код, я использую bcrypt для удаления пароля. Я скрываю возвращаемый объект, но я не получаю ожидаемых результатов. Что я делаю не так, пожалуйста, помогите. Очень признателен. Спасибо.

 var express = require('express')
var router = express.Router()
var User = require('../Models/User.js')
var bcrypt = require('bcrypt')


router.get('/:resource', function(req, res, next){
  var resource = req.params.resource

  if (resource == 'user'){
    User.find(null, function(err, users){
      if(err) {
        res.json({
          confimration: 'error',
          message: err
        })
        return
      }

        res.json({
          confimration: 'success',
          message: users
        })
        return
    })
  }
})

router.post('/:resource', function(req, res, next){
  var resource = req.params.resource
  var data = req.body
  var password = data.password
  var hashed = bcrypt.hashSync(password, 10)
  data['password'] = hashed

  if(resource == "user") {
    User.create(data, function(err, user){
      if(err){
        res.json({
          confirmation: 'fail',
          message: err
        })
        return
      }
      res.json({
        confirmation: 'success',
        result: user
      })
      return
    })
  }
})

    module.exports = router



   var mongoose = require('mongoose')

    var UserSchema = new mongoose.Schema({
      firstName: {type: String, lowercase: true, trim: true, default: ''},
      lastName: {type: String, lowercase: true, trim: true, default: ''},
      email: {type: String, lowercase: true, trim: true, default: ''},
      city: {type: String, default: ''},
      password: {type: String, default: ''},
      timestamp: {type:Date, default: Date.now}
    })

    UserSchema.methods.summary = function() {
      var summary = {
        firstName: this.firstName,
        lastName: this.lastName,
        email: this.email,
        timestamp: this.timestamp,
        id: this._id,
        city: this.city
      }
      return summary
    }

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

{
_id: "57f460235805b52762605df2",
__v: 0,
timestamp: "2016-10-05T02:06:27.829Z",
password: "$2a$10$DIHrMO8WcRmOkIVj93SSQ.LFe5vPYH6R3xrfsSuql.v2jfU2mcO.C",
city: "new york",
email: "4",
lastName: "4",
firstName: "4"
}
  

Комментарии:

1. Откуда вы пытаетесь скрыть свой пароль?

2. Я хочу вернуть все, кроме пароля. { _id: «57f460235805b52762605df2», __v: 0, временная метка: «2016-10-05T02:06:27.829Z», город: «Нью-Йорк», адрес электронной почты: «4», Фамилия: «4», Имя: «4» }

3. Где вы используете свой метод summary? Я даже не думаю, что это имеет значение. потому что, если вы говорите о скрытии пароля при ответе на запрос post, вы отправляете весь документ, который вы только что сохранили. Вы ничего не фильтруете.

4. Да, Джек. Как я могу это скрыть? также выполняю запрос get.

5. только для вас: npmjs.com/package/mongoose-filter-properties

Ответ №1:

для router.get этого вы могли бы использовать поле проекции. Я не знаю, почему у вас null. но при этом find выполняется поиск всех документов в коллекции пользователей и исключается поле пароля для каждого возвращенного документа. помогает ли это с router.get ?

   if (resource == 'user'){
    User.find({},{password: 0}, function(err, users){
      if(err) {
        res.json({
          confimration: 'error',
          message: err
        })
        return
      }

        res.json({
          confimration: 'success',
          message: users
        })
        return
    })
  }