首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Schema.post(‘查找’)和schema.post('findOne')

Schema.post(‘查找’)和schema.post('findOne')
EN

Stack Overflow用户
提问于 2016-06-01 17:05:44
回答 2查看 1.9K关注 0票数 1

app.js

代码语言:javascript
复制
Match.find({}).lean().exec(function(err, matches) {});
Match.findById(id).lean().exec(function(err, match) {});

我在不同的路线上使用这两种查询。

匹配-模型:

代码语言:javascript
复制
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.createdAt =.和message.updatedAt .)findfindOne。是否有一个同时用于查询findfindByID的钩子?所以我只需要写一次代码?因为find不会触发findById

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-01 17:35:04

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

代码语言:javascript
复制
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,所以这也应该包括在内。

票数 2
EN

Stack Overflow用户

发布于 2021-04-01 08:46:15

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

代码语言:javascript
复制
schema.post('init', function(doc) {
  console.log('%s has been initialized from the db', doc._id);
});

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

这里有文档:https://mongoosejs.com/docs/middleware.html#synchronous

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37574834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档