это не относится к схеме goose - PullRequest
0 голосов
/ 14 апреля 2020

у меня есть схема mon goose, и это код

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var projectsSchema = new Schema({
    title : {
        type: String,
        required : true
    },
    description : {
        type: String,
        required : true
    },
    mainimg_path : {
        type: String,
        required : true
    }
});

module.exports = projectsSchema;

, и я делаю запросы к базе данных в модуле dao, и это код

var mongoose = require('mongoose');
var projectsSchema = require('./projects.model');

projectsSchema.statics = {
    createProject : async (data) => {
        try{
            console.log(this)
            const addedProject = await new this(data);
            await addedProject.save();
        }
        catch(e){
            console.log("error occured while saving a new project")
            console.log(e)
        }  
    },

    get : async () => {
       try{
           console.log(projectsSchema)
           await this.find({});
       }
       catch(e){
        console.log("error occured while retreive a new project")
        console.log(e)
       }
   }
}

var projectsModel = mongoose.model('Projects', projectsSchema);
module.exports = projectsModel;

и, наконец, это модуль контроллера

var Projects = require('./projects.dao');
const { check, validationResult } = require('express-validator');

exports.validate = (method) =>{
    switch(method){
      case "createProject":
          return [
            check("title", "title is required")
            .not()
            .isEmpty().withMessage("tile must not be empty")
            .isLength({ min: 2,max:100 }).withMessage("title long min is : 2 chars max is : 100 chars"),
            check("description", "description is required")
            .not()
            .isEmpty().withMessage("description must not be empty")
            .isLength({ min: 2,max:3000 }).withMessage("title long min is : 2 chars max is : 3000 chars")
            ]     
      default:
    }   
}


exports.createProject = async  (req, res, next)=>{
    try{
       const errors = validationResult(req); 
        if (!errors.isEmpty()) {
        res.status(422).json({ msg:"validationErr", errors: errors.array() });
        return;
       }
       if(!req.file){
           res.status(422).json({msg:"you must select img"});
           return
       }
        const project = {
        title: req.body.title,
        description: req.body.description,
        mainimg_path: req.file.filename
             }
        await Projects.createProject(project);
        res.status(200).json({msg:"new project added successfully",hexCode:"00"})
    }
    catch(e){
        console.log(e);
        res.status(400).json({msg:"err occurred while adding a new project",hexCode:"FF"})
    }
}


exports.getAllProjects = async (req, res, next)=>{
    try{
       const projects = await Projects.get();
       res.status(400).json({msg:"all projects retreived successfully",hexCode:"00",projects:projects})

    }
    catch(e){
        console.log(e);
        res.status(400).json({msg:"error occurred while trying retreive all projects",hexCode:"FF"})
    }
}

при попытке опубликовать новый проект произошла ошибка (это не конструктор) и при попытке получить все проекты произошла ошибка (this.find не является функцией);

почему это произошло? заранее спасибо

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я решил, ребята, я использовал обычное ключевое слово функции вместо функции стрелки, так что теперь это относится к объекту, а не к функции

0 голосов
/ 15 апреля 2020

Я думаю, что область действия this будет объектом, обертывающим методы.

Попробуйте использовать статику, как указано в docs

    projectsSchema.statics.createProject = async function (data) {
        try{
            console.log(this)
            const addedProject = await new this(data);
            await addedProject.save();
        }
        catch(e){
            console.log("error occured while saving a new project")
            console.log(e)
        }  
    };

    projectsSchema.statics.get = async function () {
       try{
           console.log(projectsSchema)
           await this.find({});
       }
       catch(e){
        console.log("error occured while retreive a new project")
        console.log(e)
       }
   }
...