2017-02-11 4 views
0

Я пытаюсь сохранить модель, которая имеет отношение к другому:Невозможно сохранить мангуст модель со ссылкой на другой объект

exports.portfolioSchema = new Schema({ 
    name: {type: String, required: true, unique: true}, 
    isActive: {type: Boolean, default: true} 
}); 

exports.projectSchema = new Schema({ 
    name: {type: String, required: true, unique: true}, 
    isActive: {type: Boolean, required: true, default: true}, 
    portfolio: {type: mongoose.Schema.Types.ObjectId, ref: 'portfolioSchema', required: true}, 
    isCodeBaseFullyOwned: {type: Boolean, required: true, default: false} 
}); 

При попытке сохранить его:

Project = store.model('Project', schema.projectSchema); 
var p = new Project(); 
p.name = project; 
Portfolio.findOne({"name":activePortoflios[0]}, '_id', function (err, data) { 
    p.portfolio = data._id; 
}); 
p.isActive = true; 
p.save(function (err) { 
    if (err) console.log(err); 
}); 

Я получаю следующую ошибку:

{ ValidationError: Project validation failed 
    at MongooseError.ValidationError (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/error/validation.js:23:11) 
    at model.Document.invalidate (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/document.js:1524:32) 
    at /Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/document.js:1399:17 
    at validate (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:706:7) 
    at /Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:743:9 
    at Array.forEach (native) 
    at ObjectId.SchemaType.doValidate (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:711:19) 
    at /Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/document.js:1397:9 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
    errors: 
    { portfolio: 
     { ValidatorError: Path `portfolio` is required. 
      at MongooseError.ValidatorError (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/error/validator.js:24:11) 
      at validate (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:705:13) 
      at /Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:743:9 
      at Array.forEach (native) 
      at ObjectId.SchemaType.doValidate (/Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/schematype.js:711:19) 
      at /Users/sasha/PycharmProjects/P5N/node_modules/mongoose/lib/document.js:1397:9 
      at _combinedTickCallback (internal/process/next_tick.js:67:7) 
      at process._tickCallback (internal/process/next_tick.js:98:9) 
     message: 'Path `portfolio` is required.', 
     name: 'ValidatorError', 
     properties: [Object], 
     kind: 'required', 
     path: 'portfolio', 
     value: undefined } }, 
    message: 'Project validation failed', 
    name: 'ValidationError' } 

Есть что-то, что мне не хватает? data._id дает тип ObjectId, мне нужно установить что-нибудь еще?

ответ

0

findOne - асинхронный вызов. Следовательно, когда вы пытаетесь сохранить его, обратный вызов findOne не был возвращен. Поскольку требуется свойство portfolio, оно не прошло проверку.

Project = store.model('Project', schema.projectSchema); 
var p = new Project(); 
p.name = project; 

Portfolio.findOne({ name: activePortoflios[0] }, '_id', function (err, data) { 
    if (err) return handleError(err); 
    p.portfolio = data._id; 
    p.isActive = true; 
    p.save(function (err) { 
     if (err) console.log(err); 
    }); 
}); 
+0

Есть ли способ делать вещи синхронно без обратных вызовов? – abolotnov

+0

NodeJs был разработан для работы с обратными вызовами. Что заставляет вас беспокоиться? Вы можете использовать [обещания] (http://mongoosejs.com/docs/promises.html), если вы предпочитаете синтаксис. Использование синхронной функции приведет к зависанию вашего процесса. –

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