mon goose stati c функция "creation.fetchTotalPointsPerChild" не является функцией - PullRequest
0 голосов
/ 09 марта 2020

Я хотел бы получить какой-либо результат от агрегатной функции одной модели, но я получаю сообщение об ошибке, подобное:

creation.fetchTotalPointsPerChild не является функцией

Вот мои файлы:

Это моя схема: реализация. js

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

const actionSchema = new Schema({
    type: {
        type: String,
        required: true
    },
    point: {
        type: Number,
        min: -1001,
        max: 1001,
        required: true
    },
    pointType: {
        type: String,
        required: true
    },
    goal:{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Goals'
    }, 
    penalty: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Penalty'
    }
},{
    timestamps: true
})

const realizationSchema = new Schema({
    child: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Child'
    },
    actions: [actionSchema]
},
{
    timestamps: true
});

realizationSchema.statics.fetchTotalPointsPerChild = function(callback) {
    return this.aggregate([
        { $unwind: "$actions" },
        {
            $group: {
                _id: null,
                totalPointsPerChild: {
                    $sum: "$actions.point"
                }
            }
        }
    ], function(err, result) {
        if (err) callback(err);
        callback(result)
    })
}

module.exports = mongoose.model('Realization', realizationSchema);

Это мой маршрутизатор: реализацияRouter. js

const express = require('express');
const bodyParser = require('body-parser');
const Realization = require('../models/realization');

const realizationRouter = express.Router();

realizationRouter.use(bodyParser.json());

realizationRouter.route('/:childId/actions/totalPoints')
.get((req, res, next) => {
    Realization.findOne({child: req.params.childId})
    .populate('goals')
    .populate('penalty')
    .then(realization => {
        if(realization) {
            realization.fetchTotalPointsPerChild((err, result) => {
                if(err){
                    next(err);
                }
                res.statusCode = 200;
                res.setHeader('Content-Type', 'application/json');
                res.json(result);
            })
        } else {
            res.statusCode = 200;
            res.setHeader('Content-Type', 'application/json');
            res.json(`There is no action to show from this child ${req.params.childId}`);
        }
    })
    .catch(err => next(err));
});

Я пробовал изменения, такие как замена статики на методы или экземпляры, но для меня то, что имеет больше смысла, это статика, но я продолжаю получать ту же ошибку. Пожалуйста, кто-нибудь знает, что мне здесь не хватает?

1 Ответ

1 голос
/ 09 марта 2020
if(realization) {
   realization.fetchTotalPointsPerChild((err, result) => {
   if(err){
   next(err);
   }
   res.statusCode = 200;
   res.setHeader('Content-Type', 'application/json');
   res.json(result);
})

Я думаю, вы не уверены в переменной realization. Переменная реализации является результатом запроса. Возвращается не ваша модель, поэтому функции нет. Stati c может использоваться непосредственно на вашей модели, поэтому Realization.fetchTotalPointsPerChild()...

...