Почему array.push () не работает в моей модели Mongoose? - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в Node.js, и я борюсь здесь с одним из моих первых скриптов. Моя проблема в том, что я хочу поместить объект в массив, который определяется объектом Mongoose.

Вот мое определение объекта. Вы увидите три разные попытки (две прокомментированные) для толкания объекта в определении метода generateAuthToken:

const mongoose = require('mongoose');
const validator = require('validator');
const jwt = require('jsonwebtoken');

let UserSchema = new mongoose.Schema({
email: {
    type: String,
    required: true,
    minlength: 1,
    trim: true,
    unique: true,
    validate: {
        validator: validator.isEmail,
        message: '{VALUE} is not a valid email'
    }
},
password: {
    type: String,
    required: true,
    minlength: 6
},
tokens: [{
    access: {
        type: String,
        required: true
    },
    token: {
        type: String,
        required: true
    }
}]
});

UserSchema.method('generateAuthToken', function() {

// let user = this;
let access = 'auth';
let token = jwt.sign({_id: this._id.toHexString(), access}, 'secret').toString();

console.log(token);
console.log(jwt.verify(token, 'secret'));
console.log(this.tokens);

// user.tokens[] = {access, token};
this.tokens.push({acces, token});
// user.tokens = user.tokens.concat([{access, token}]);


return this.save().then(() => {
    return token;
});

});

let User = mongoose.model('User', UserSchema);

module.exports = {User};

generateAuthToken () вызывается на сервере со следующим маршрутом:

app.post('/users', (req, res) => {

let user = new User(_.pick(req.body, ['email', 'password']));

user.save().then((doc) => {
    return user.generateAuthToken();
}).then((token) => {
    res.header('x-auth', token).send(user);
}).catch((e) => {
    res.status(400).send(e);
});

});

Когда я использую этот маршрут с действительными данными, мне возвращается ошибка 400. Пользовательский объект записан в базе данных, но его массив токенов пуст. Я не получаю никакой ошибки в терминале, но смещая вызовы console.log (), я могу сузить ошибку вызовом this.tokens.push (). Ничего из этого метода не выполняется.

Итак, кто-нибудь может помочь мне отследить ошибку?

Использование узла 10.9.0 и:

"body-parser": "^1.18.3",
    "express": "^4.16.3",
    "jsonwebtoken": "^8.3.0",
    "lodash": "^4.17.10",
    "mongodb": "^3.1.4",
    "mongoose": "^5.2.10",
    "validator": "^10.7.1"

Спасибо!

1 Ответ

0 голосов
/ 06 сентября 2018

Вы используете сокращенный JSON при вставке объектов в ваш массив. Однако у вас есть опечатка на acces:

this.tokens.push({acces, token});

Должно быть: this.tokens.push({access, token}); (примечание: acces -> access, с двумя s, а не с одним)

...