не удается сохранить данные в MongoDB с этим назначением

#mongodb #mongoose

#mongodb #мангуст

Вопрос:

Я изучаю MEAN stack с книгой Getting MEAN с помощью Mongo, Express, Angular и Node.

Я следую коду и все тестирую, но получаю ошибку без ошибок, на странице книги 364, я не могу сохранить соль и хэш в MongoDB.

Я использую postman для тестирования своего кода так же, как и в книге, и я могу получить JWT в postman, но могу получить _id, name, email и __v только в MongoDB, когда я проверил MongoDB с db.users.find() помощью command.

результат, подобный следующему списку:

 "_id" : ObjectId("57f5f1a91093e2650f427081"), 
"email" : "bb7@q.com", 
"name" : "bb7", 
"__v" : 0 
  

Я использую arch Linux, а версия MongoDB — 3.2.9

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

метод SetPassword

 userSchema.methods.setPassword = (password) => {
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000,64,   'sha512').toString('hex');
};
  

и весь мой код о регистре

users.js

    var mongoose = require('mongoose');
var crypto = require('crypto');
 var jwt = require('jsonwebtoken');

var userSchema = new mongoose.Schema({
  email: {
   type: String,
    unique: true,
   required: true
 },
  name: {
  type: String,
   required: true
  },
 hash: String,
  salt: String
});

 userSchema.methods.setPassword = (password) => {
  this.salt = crypto.randomBytes(16).toString('hex');
 this.hash = crypto.pbkdf2Sync(password, this.salt, 1000,64, 'sha512').toString('hex');
};

userSchema.methods.validPassword = (password) => {
  console.log('this salt  ' this.salt);
 // pbkdf2 params is password, salt, iterations, hashBytes, digest
 var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha512').toString('hex');
  console.log('this hash ' this.hash);
 return this.hash === hash;
   };

userSchema.methods.generateJwt = () => {
  var expiry = new Date();
  expiry.setDate(expiry.getDate()   7);

 return jwt.sign({
_id: this._id,
email: this.email,
name: this.name,
exp: parseInt(expiry.getTime() / 1000) // Unix time in seconds
 }, process.env.JWT_SECRET);
 };

mongoose.model('User', userSchema);
  

authentication.js

   var passport = require('passport');
 var mongoose = require('mongoose');
 var User = mongoose.model('User');

 var sendJSONresponse = (res, status, content) => {
  res.status(status);
 res.json(content);
 };

 module.exports.register = (req, res) => {

  if(!req.body.name || !req.body.email || !req.body.password) {
   sendJSONresponse(res, 400, {
      'message': "All fields required"
   });
   return;
  }

  var user = new User();

  user.name = req.body.name;
  user.email = req.body.email;

  user.setPassword(req.body.password);

 user.save((err) => {
   var token;
   if(err) {
     sendJSONresponse(res, 404, err);
   } else {
     token = user.generateJwt();
     sendJSONresponse(res, 200, {
      'token': token
     });
  }
 })
  }

 /** login */
 module.exports.login = (req, res) => {
   if(!req.body.email || !req.body.password) {
    sendJSONresponse(res, 400, {
     'message':'All fields required'
   });
  return;
 }

   passport.authenticate('local', (err, user, info) => {
    var token;

     if(err) {
      sendJSONresponse(res, 404, err);
      return;
   }

    if(user) {
       token = user.generateJwt();
     sendJSONresponse(res, 200, {
       'token': token
      });
    } else {
      sendJSONresponse(res, 401, info); // info msg about why authentication failed
     }
 })(req, res);
  };
  

и весь код на адресе github https://github.com/simonholmes/getting-MEAN/tree/chapter-11

Ответ №1:

Вот что я сделал:

  • клонирование репозитория: git clone git@github.com:simonholmes/getting-MEAN.git
  • ветка оформления заказа: cd getting-MEAN; git checkout chapter-11
  • Установите JWT secret: export JWT_SECRET=secret
  • запустить приложение: npm start

И отправить запрос на регистрацию:

 curl -v -X POST http://localhost:3000/api/register -d "email=user@gmail.comamp;password=passamp;name=user"
  

В ответ получено:

 {"token":"some token"}
  

Затем проверил mongo db:

 mongo
> use Loc8r
> db.users.find() 
  

Хэш и соль хранятся вместе с атрибутами rest. Итак, не уверен, какая у вас проблема? Если вы хотите получить больше атрибутов в ответ, просто расширьте то, что возвращается в register методе в authentication контроллере:

 user.save(function(err, user) {
  var token;
  if (err) {
    sendJSONresponse(res, 404, err);
  } else {
    token = user.generateJwt();
    sendJSONresponse(res, 200, {
      "token" : token,
      "email": user.email,
      "id": user._id
    });
  }
});
  

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

1. нет, я хочу сохранить соль и хэш в MongoDB, поэтому не могли бы вы рассказать мне о своей системе и версиях MongoDB и NodeJS? Я очень смущен, почему не удается сохранить данные в MongoDB, и я исправил это на полдня, я чувствую, что у функции SetPassword есть проблемы, но не уверен. и спасибо @mkorszun

2. затем я рекомендую вам начать отладку; просто добавьте несколько консольных журналов с сгенерированными хэшем и солью и проверьте их значения. Также проверьте объект user непосредственно перед его сохранением — у вас должен быть ответ, если заданы salt amp; hash.

3. Я понял, проблема в функции стрелки в ES6, я подумал, что в NodeJS все в порядке, поэтому я изменил ее. еще раз спасибо.