2016-06-01 3 views
0

app.jsschema.post ('найти') и schema.post ('findOne')

Match.find({}).lean().exec(function(err, matches) {}); 
Match.findById(id).lean().exec(function(err, match) {}); 

Я использую оба этих запросов по разным трассам.

Match-модель:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var messageSchema = new Schema({ 
    // ... 
    message: {type: String, required: true}, 
}, { 
    timestamps: true 
}); 

var matchSchema = new Schema({ 
    // ... 
    messages: [messageSchema] 
}, { 
    timestamps: true 
}); 

matchSchema.post('find', function(result) { 
    result.forEach(function(chat) { 
     chat.messages.forEach(function(message) { 
      message.createdAt = new Date(message.createdAt).getTime(); 
      message.updatedAt = new Date(message.updatedAt).getTime(); 
     }); 
    }); 
}); 

matchSchema.post('findOne', function(result) { 
    if (result !== null) { 
     result.messages.forEach(function(message) { 
      message.createdAt = new Date(message.createdAt).getTime(); 
      message.updatedAt = new Date(message.updatedAt).getTime(); 
     }); 
    } 
}); 

var Match = mongoose.model('Match', matchSchema); 

module.exports = Match; 

Синтаксический формат даты по умолчанию (например, 2016-05-19T13:29:07.731Z) в Java (который я использую на стороне клиента) является боль, поэтому я вместо того, чтобы перезаписать его с меткой времени Unix , который легко форматировать на Java. Проблема с этим, у меня есть дубликат кода (message.createdAt = ... и message.updatedAt ..) для find и findOne. Есть ли крючок, который срабатывает для обоих запросов find и findByID? Значит, мне нужно написать только один код? Потому что find не запускается для findById.

ответ

1

Поскольку оба крючок уже очень похож, вы можете объединить их в одну функции, которая привыкает все (подобные) крючки:

function processResult(result) { 
    if (result) { 
    if (! Array.isArray(result)) { 
     result = [ result ]; 
    } 
    result.forEach(function(chat) { 
     chat.messages.forEach(function(message) { 
      message.createdAt = new Date(message.createdAt).getTime(); 
      message.updatedAt = new Date(message.updatedAt).getTime(); 
     }); 
    }); 
    } 
} 

matchSchema.post('find', processResult); 
matchSchema.post('findOne', processResult); 

Я считаю, что findOne сработает для findById, так что должно быть покрыто также.

+0

Да, это будет сделано. Но так или иначе, нет ли ** hook ** для всех типов select (find/findOne/findById)? – Chris

+0

Нет, похоже, нет ни одного крючка, который поймает все это. – robertklep

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

  • Нет связанных вопросов^_^