schema.post(' find')和schema.post(' findOne')

时间:2016-06-01 17:05:45

标签: mongoose mongoose-schema

app.js

Match.find({}).lean().exec(function(err, matches) {});
Match.findById(id).lean().exec(function(err, 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;

在Java中解析默认日期格式(如2016-05-19T13:29:07.731Z)(我在客户端使用)是一件痛苦的事,这就是为什么我用unix时间戳覆盖它的原因,这很容易格式化在Java中。 这个问题是,message.createdAtmessage.updatedAt有重复的代码(find = ...和findOne ..)。 是否有一个钩子可以触发查询findfindByID?所以我只需要编写一次代码?因为find不会触发findById

2 个答案:

答案 0 :(得分:2)

由于两个钩子看起来非常相似,你可以将它们组合成一个被所有(类似)钩子使用的函数:

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,因此也应该包含这些内容。

答案 1 :(得分:0)

对于仍在搜索此内容的任何人来说,在每个数据库访问函数之后都会调用一个钩子。

schema.post('init', function(doc) {
  console.log('%s has been initialized from the db', doc._id);
});

这个钩子的唯一问题是它是同步的,不能处理承诺。

此处记录:https://mongoosejs.com/docs/middleware.html#synchronous