У меня есть этот код для установки ObjectID для свойства бренда productSchema:

productSchema.path('brand').set(function (namebrand) {
    var brandID;

    Brand.findOne({ 'name': namebrand }, 'id name', function (err, result){
        if (err) console.log(err);

        if (result){
            // console.log("Result: "+result);
            brandID =  result.id;

        } else {
            var newBrand = new Brand({name:namebrand});
            newBrand.save(function (err, newBrandID){
                console.log("newBrandID : "+newBrandID)
                brandID = newBrandID.id;
            });
        }
    });
    return mongoose.Types.ObjectId(brandID);
});

Моя проблема в том, что когда выполняется установщик Brand ObjectID, я получаю разные ObjectId, например:

return mongoose.Types.ObjectId(brandID); // 52ffaa218050b7c4652502de
console.log("newBrandID : "+newBrandID) // newBrandID : { __v: 0, name: 'new Brand name', _id: 52ffaa218050b7c4652502df }

Итак, как правильно делать то, что я хочу? Я новичок в этом: /

P.S .: Заранее спасибо и извините за мой английский.

0
Richard Cotrina 15 Фев 2014 в 22:09

1 ответ

Лучший ответ

Здесь нельзя использовать возвращаемое значение. Мангуст set должен быть синхронным, а вы делаете асинхронный запрос к БД. Сначала найдите бренд в БД, а затем укажите его на продукте.

var productModel; // you must already have loaded this
var namebrand = "somebrand";
Brand.findOne({ 'name': namebrand }, 'id name', function (err, result){
    if (error) {
        console.error(error);
        return;
    }
    if (result){
        productModel.brand = result._id;
    } else {
        var newBrand = new Brand({name:namebrand});
        productModel.brand = newBrand._id
        newBrand.save(function (err, newBrandID){
            console.log("newBrandID : "+newBrandID)
            brandID = newBrandID.id;
        });
    }
    productModel.save();
});
0
Peter Lyons 15 Фев 2014 в 22:26
Спасибо, поэтому я должен добавить этот код в обработчик, который сохраняет продукт, верно?
 – 
Richard Cotrina
15 Фев 2014 в 22:39
1
Да исправить. В общем, я советую использовать мангусты легкими. Используйте схемы и запросы, но глубокая привязка вашего кода к оставшимся волшебным функциям, вероятно, окажется неразумной в долгосрочной перспективе.
 – 
Peter Lyons
16 Фев 2014 в 00:13