为什么array.push()在我的Mongoose模型中不起作用?

时间:2018-09-05 22:10:16

标签: node.js mongodb mongoose mongoose-schema

我是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 :(得分:2)

将对象推入数组时,您正在使用简写json。但是,您在acces上有错字:

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

应为:this.tokens.push({access, token});(注意:acces-> access,带有两个s,而不是一个)