2015-10-12 31 views
1

我是Node.js和Express的新手。我想創建一個供應商並將其與City對象關聯。node.js回調,嵌套函數,如何重構

//城市模型 var mongoose = require('mongoose');

var CitySchema = new mongoose.Schema({ 
    name: String 
}); 

//供應商型號

var mongoose = require('mongoose'); 

var VendorSchema = new mongoose.Schema({ 
    name: String, 
    city: { type: mongoose.Schema.Types.ObjectId, ref: 'City' } 
}); 


mongoose.model('Vendor', VendorSchema); 

//routes/index.js

vendor.save(功能)是內部City.findOne(功能),它看起來有點難看。我希望代碼遵循單一責任規則,或者讓代碼更乾淨。編寫這些嵌套回調函數的最佳做法是什麼?

非常感謝。

mongoose.model('City', CitySchema); 

router.post('/vendor', function(req, res, next){ 
    var vendor = new Vendor(); 
    vendor.name = req.body.name; 

    City.findOne({name:req.body.city}, function(err, city) { 
     if (err) return next(err); 
     vendor.city = city; 

     vendor.save(function(err, vendor) { 
      if (err) { return next(err); } 
      res.json(vendor); 
     }); 
    }); 
}); 

回答

0

您可以嘗試使用Model.populate()

var Vendor = mongoose.model('Vendor', VendorSchema); 

var opts = [{ path: 'city', match: { name: req.body.city}}]; 

var vendor = new Vendor({ 
    name: req.body.name 
}); 

Vendor.populate(vendor, opts, function (err, vendor) { 
    if (err) { return next(err); } 
      res.json(vendor); 
    });