У меня есть две схемы модели Mongoose следующим образом. Модель LabReport содержит массив указанной модели SoilLab. В модели SoilLab есть статический метод, который я использовал для выбора полей, отображаемых при получении LabReport.

//LabReport.js
var mongoose = require("mongoose");
var SoilLab = mongoose.model("SoilLab");

var LabReportSchema = new mongoose.Schema(
  {
    labFarm: { type: mongoose.Schema.Types.ObjectId, ref: "Farm" },
    testName: { type: String },
    soilLabs: [{ type: mongoose.Schema.Types.ObjectId, ref: "SoilLab" }],
  },
  { timestamps: true, usePushEach: true }
);

LabReportSchema.methods.toLabToJSON = function () {
  return {
    labReport_id: this._id,
    testName: this.testName,
    soilLabs: this.soilLabs.SoilToLabJSON(),

  };
};

mongoose.model("LabReport", LabReportSchema);
//SoilLab.js
var mongoose = require("mongoose");

var SoilLabSchema = new mongoose.Schema(
  {
    description: { type: String },
    sampleDate: { type: Date },
    source: { type: String },
  },
  { timestamps: true, usePushEach: true }
);

SoilLabSchema.methods.SoilToLabJSON = function () {
  return {
    description: this.description,
    sampleDate: this.sampleDate,
    source: this.source,
  };
};

mongoose.model("SoilLab", SoilLabSchema);

Когда я пытаюсь получить LabReport, я получаю «this.soilLabs.SoilToLabJSON не является функцией». Вот как я пытаюсь получить LabReport.

//labReports.js

...

    return Promise.all([
        LabReport.find()
          .populate("soilLabs")
          .exec(),
        LabReport.count(query).exec(),
        req.payload ? User.findById(req.payload.id) : null,
      ]).then(function (results) {
        var labReports = results[0];
        var labReportsCount = results[1];
        var user = results[2];
        return res.json({
          labReports: labReports.map(function (labReport) {
            return labReport.toLabToJSON(user);   //This cant find SoilToLabJSON 
          }),

Если я удалю .SoilToLabJSON из LabReport.js и просто вызову this.soilLabs, он будет работать, но выведет все данные из почвыLabs, что станет проблемой, когда у меня будет модель, заполненная большим количеством данных. Я немного покопался в статике и методах и попытался изменить ее на статику, но это не сработало.

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

1
Sergio Cardoso 31 Июл 2020 в 22:45

1 ответ

Лучший ответ

Lab Report.toLa ToJSON передает массив, и это вызывало у меня ошибку. Я просто отредактировал LabReport.js следующим образом, чтобы взять массив и правильно сопоставить его с SoilToLab JSON.

myTestSoilLabOutput = function (soilLabs) {
  var test = soilLabs.map(function (soilLab) {
    return soilLab.SoilToLabJSON();
  });
  return test;

Изменен LabReportSchema.methods.toLabToJSON на:

LabReportSchema.methods.toLabToJSON = function () {
  return {
    labReport_id: this._id,
    testName: this.testName,
    soilLabs: myTestSoilLabOutput(this.soilLabs),

  };
};
1
Sergio Cardoso 7 Сен 2020 в 00:14