Я изучаю экспресс и мангуст и не могу получить схему для сохранения, но могу увидеть ее с помощью console.log () - PullRequest
2 голосов
/ 19 сентября 2019

РЕДАКТИРОВАТЬ: я думаю, WeekCount сохраняет до загрузки записей в него.Возможно, некорректное использование функции find ()?

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

У меня есть схема (см. Ниже), которая имеет массив типа: Schema.Types.ObjectId, который я не могу сохранить в Монго.Массив пуст.

У меня есть форма, которая выбирает названия лагерей и типы животных (коров, быков, телят) и создает форму.

Форма отображается, иPOST может читать данные формы.Данные формы считываются в схему и отображаются нормально с console.log, но не сохраняют всю схему в mongo.

Я прочитал много постов и пробовал много вещей, таких как markModified, использовалполная схема.

Уже давно часы, и я был бы признателен за помощь.

Экспресс мангуста Модели:

var WeekCountSchema = new Schema({
  dateOfCount: { type: Date },
  campCounts: [{type: Schema.Types.ObjectId, ref: 'CampCount'}]  < ----- problem
});

var CampCountSchema = new Schema({
      campName: String,
      campCountDate: Date,
      count: {
        ox: Number,
        cow: Number,
        bull: Number,
        heifer: Number,
        calf: Number,
        weaner: Number
      }
});

шаблон мопса:

extends layout

block content
  h1 #{title}


  form(method='POST' action='')

    div.form-group
    label(for='campClassCount')
    table(style='width:100%', border="1")
        th 
          label(for='dateOfCount' enctype="application/json") Date of Count:
          input#dateOfCount.form-control(type='date',  name='dateOfCount')

        tr
        th Camps
        each cattleClass in cattleClasses
          th #{cattleClass.name}

        tr
        each camp in camps
          tr
          th #{camp.name}
          each cattleClass in cattleClasses   
            td()
              input#campClassCount.form-control(type='text',  name=camp.name+"."+cattleClass.name)

    button.btn.btn-primary(type='submit') Submit

  if errors 
   ul
    for error in errors
     li!= error.msg

weekCountController: Прокрутите вниз до <---- </p>

// Handle Week Count create on POST.
exports.weekCount_create_post = [

  // Validate that the name field is not empty.

  validator
    .body("dateOfCount", "Week Count Data Required")
    .toDate()
    .isLength({ min: 1 })
    .trim(),

  // Sanitize (escape) the name field.
  validator.sanitizeBody("*").escape(),

  // Process request after validation and sanitization.
  (req, res, next) => {
    var weekCount = new WeekCount({
      dateOfCount: req.body.dateOfCount
    });

    // console.log(req.body);
    // Extract the validation errors from a request.
    const errors = validator.validationResult(req);

    if (!errors.isEmpty()) {
      // There are errors. Render the form again with sanitized values/error messages.
      console.log("ERRORS!s");
      async.parallel(
        {
          camps: function(callback) {
            Camp.find()
              .sort("name")
              .exec(callback);
          },
          cattleClasses: function(callback) {
            CattleClass.find(callback);
          }
        },
        function(err, results) {
          if (err) {
            return next(err);
          }
          res.render("weekCount_form", {
            title: "There were Errors! New Week Count",
            camps: results.camps,
            cattleClasses: results.cattleClasses
          });
        }
      );

      return;
    } else {
      // Data from form is valid.

      // ********************** GET PARAMS ***************************************

      Camp.find({}, "name").exec(function(err, list_camps) {
        if (err) {
          return next(err);
        }

        CattleClass.find({}, "name").exec(function(err, list_cattleClasses) {
          if (err) {
            return next(err);
          }

          var campCountArray = [];
          list_camps.forEach(function(campName) {
            var campCount = new CampCount({
              campName: campName.name
            });

            var emptyCount = true;
            list_cattleClasses.forEach(function(cattleClassName) {
              var tempVar = campName.name + "." + cattleClassName.name;
              var tempNum = parseInt(req.body[tempVar]);
              // console.log(tempNum);
              if (tempNum) {
                // console.log(req.body[tempVar]);
                campCount.count[cattleClassName.name] = req.body[tempVar];
                emptyCount = false;
              } else {
                campCount.count[cattleClassName.name] = 0;
              }
            });

            if (!emptyCount) {
              campCount.save(function(err) {
                if (err) {
                  return next(err);
                }
              });

              campCountArray.push(campCount);
            }
          });
          console.log("CampCountArray");
          console.log(campCountArray);
          weekCount.campCounts = campCountArray;
        });
      });

      // ****************************************************************
      // Check if Week Count with same date already exists.
      WeekCount.findOne({ dateOfCount: req.body.dateOfCount }).exec(function(
        err,
        found_weekCount
      ) {
        if (err) {
          console.log("ERROR findone " + err);
          return next(err);
        }
        if (found_weekCount) {
          // Week count exists, redirect to its detail page.
          console.log("FOUND");
          res.redirect(found_weekCount.url);
        } else {
          console.log("NOT FOUND");
          // weekCount.markModified('campCounts');
          weekCount.save(function(err) {            // <---- does not save 
            if (err) {
              console.log("ERROR SAVING: " + err);
              return next(err);
            }
            console.log("weekCount saved");
            console.log(weekCount);
            // output below

            // Week Count saved. Redirect to week count detail page.

            //   console.log(weekCount.campCounts);
            res.redirect(weekCount.url);

          });
        }
      });
    }
  }
];

Вывод из console.log:

GET /catalog/WeekCount/create 200 219.085 ms - 3782
NOT FOUND  <------ count not a duplicate (OK)
CampCountArray
[ { count: { calf: 1, bull: 0, cow: 0, weaner: 0, ox: 0, heifer: 0 },
    _id: 5d83720e2279011e90a1614b,
    campName: 'Bloekom' },
  { count: { calf: 1, bull: 0, cow: 0, weaner: 0, ox: 0, heifer: 0 },
    _id: 5d83720e2279011e90a1614c,
    campName: 'Davel' },
  { count: { calf: 1, bull: 0, cow: 0, weaner: 0, ox: 0, heifer: 0 },
    _id: 5d83720e2279011e90a1614d,
    campName: 'Elfas' },
  { count: { calf: 1, bull: 0, cow: 0, weaner: 0, ox: 0, heifer: 0 },
    _id: 5d83720e2279011e90a1614e,
    campName: 'Groot kamp' } ]
weekCount saved
{ campCounts: 
   [ { count: [Object],
       _id: 5d83720e2279011e90a1614b,
       campName: 'Bloekom',
       __v: 0 },
     { count: [Object],
       _id: 5d83720e2279011e90a1614c,
       campName: 'Davel',
       __v: 0 },
     { count: [Object],
       _id: 5d83720e2279011e90a1614d,
       campName: 'Elfas',
       __v: 0 },
     { count: [Object],
       _id: 5d83720e2279011e90a1614e,
       campName: 'Groot kamp',
       __v: 0 } ],
  _id: 5d83720e2279011e90a1614a,
  dateOfCount: 2019-09-06T00:00:00.000Z,
  __v: 0 }

из mongo:

{
        "_id" : ObjectId("5d83720e2279011e90a1614a"),
        "campCounts" : [ ],  <---------------------- nothing here!
        "dateOfCount" : ISODate("2019-09-06T00:00:00Z"),
        "__v" : 0
}

, где находятся campCountsМонго (образец):


{
        "_id" : ObjectId("5d83720e2279011e90a1614d"),
        "count" : {
                "calf" : 1,
                "bull" : 0,
                "cow" : 0,
                "weaner" : 0,
                "ox" : 0,
                "heifer" : 0
        },
        "campName" : "Elfas",
        "__v" : 0
}

, но weekCount не обновляется.Это проблема.

1 Ответ

0 голосов
/ 20 сентября 2019

Я думаю, что ваше подозрение верно, что weekCount сохраняется до завершения обратного вызова CattleClass.find ().

Это можно исправить с помощью синтаксиса .then:

CattleClass.find({}, "name").exec(function(err, list_cattleClasses) {

...     

}).then( function () {
  WeekCount.findOne({ dateOfCount: req.body.dateOfCount }).exec(function(
  err, found_weekCount) {

  ...

  }
})

youможет также использовать синтаксис ES6 async / await, но ваш код потребует довольно много переписывания, потому что вы не можете использовать .exec () с await.

Оба метода гарантируют, что CattleClass.find() завершит выполнение перед запуском WeekCount.findOne()

Если вам нужна дополнительная информация, на Stack Overflow, посвященном асинхронному коду, есть много отличных постов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...