2017-01-25 3 views
1

Учитывая следующую схему:Chaining обещает обновить справочный документ в Мангусте

user 
    { uid:12345, name:myname, account=null } 

account 
    { _id:6789, name:"myaccount", _owner:12345 } 

Как я могу обновить user.account иметь значение его ссылочное поле account._owner. Когда создается документ учетной записи, я хочу найти и заменить значение user.account. Маршрут у меня выглядит следующим образом:

app.post('/accounts', authenticate, (req, res) => { 
    var account = new Account({ 
     name: req.body.name, 
     _owner: req.body._owner, 
    }); 
    account.save().then((doc) => { 
    //here i wasnt to update a refernce to a 
    // an account field in a User document and set 
    //it to the account.owner created above. 
     res.send(doc); 
    }, (e) => { 
     res.status(400).send(e); 
    }); 
}); 

В моем примере, когда создается учетная запись Я хочу обновить user.account до 6789 (значение созданного счета ид)

ответ

1

Mongoose обрабатывает обещания: http://mongoosejs.com/docs/promises.html

Таким образом, вы можете просто:

app.post('/accounts', authenticate, (req, res) => { 
    var account = new Account({ 
     name: req.body.name, 
     _owner: req.body._owner, 
    }); 
    account.save() 
     .then((doc) => User.findOneAndUpdate(
      { uid: req.body._owner }, 
      { $set: { account: doc._id } }, 
      { new: true } 
     ) 
     .then(() => doc); 
    }).then((account) => { 
     res.send(account); 
    }, (e) => { 
     res.status(400).send(e); 
    }); 
}); 
+0

Я бы предпочел использовать Promise, но когда я попробую это, я получаю сообщение об ошибке ".then ((account)" не является функцией. – dwax

+1

OK-исправлено это отформатировано. Отлично работает – dwax

0

Другим решением было бы прикрепить крючок к save действия учетной записи модель

var Owner = require('path/to/owner/model'); 
var schema = new Schema({name:String,_owner:{type: Schema.Types.ObjectId,ref: 'owner'}}); // ref will be useful if you want to use populate later 
schema.post('save', function(account) { 
    return Owner.findOne({uid:account._owner}) 
     .then(owner => { 
     owner.account = account._id; // assign account id to user 
     return owner.save(); 
     }) 
}); 

Тогда вам просто нужно создать новый объект учетной записи, а крючок будет делать это в фоновом режиме.

IMO, маршруты выглядят более чистыми таким образом, вы можете попробовать.

+0

@ dwax OP вы попробовали? Можете ли вы хотя бы направить этот ответ –

Смежные вопросы