schema.post('find') 和 schema.post('findOne')
schema.post('find') and schema.post('findOne')
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 中格式化。
问题是,我有 find
和 findOne
的重复代码(message.createdAt
= ... 和 message.updatedAt
..)。
是否有一个钩子可以同时触发查询 find
和 findByID
?所以我只需要编写一次代码?因为 find
不会触发 findById
.
由于两个钩子看起来已经非常相似,您可以将它们组合成一个函数,供所有(相似的)钩子使用:
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
,因此也应该包括在内。
对于仍在搜索此内容的任何人,有一个挂钩将在每个数据库访问函数之后调用。
schema.post('init', function(doc) {
console.log('%s has been initialized from the db', doc._id);
});
这个钩子的唯一问题是它是同步的,无法处理承诺。
记录在此处:https://mongoosejs.com/docs/middleware.html#synchronous
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 中格式化。
问题是,我有 find
和 findOne
的重复代码(message.createdAt
= ... 和 message.updatedAt
..)。
是否有一个钩子可以同时触发查询 find
和 findByID
?所以我只需要编写一次代码?因为 find
不会触发 findById
.
由于两个钩子看起来已经非常相似,您可以将它们组合成一个函数,供所有(相似的)钩子使用:
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
,因此也应该包括在内。
对于仍在搜索此内容的任何人,有一个挂钩将在每个数据库访问函数之后调用。
schema.post('init', function(doc) {
console.log('%s has been initialized from the db', doc._id);
});
这个钩子的唯一问题是它是同步的,无法处理承诺。
记录在此处:https://mongoosejs.com/docs/middleware.html#synchronous