Mon goose .model ('имя_модели') возвращает пустой объект, когда функция требуется в файле схемы модели mon goose. - PullRequest
1 голос
/ 22 января 2020

Я прошу прощения, если название вопроса вводит в заблуждение, потому что я не слишком уверен, как это объяснить. У меня есть 2 файла, matchedTransaction.js и player.js.

sharedApi / player. js

const MatchedTransactionModel = require('../models/matchedTransaction');

// #1: If I try to console log here, the output will be an empty object "{}"
console.log(MatchedTransactionModel);

async function banPlayer(userId) {
  // ...
  // Because MatchedTransactionModel is an empty object, 
  // the code below will crash with the following error: 
  // "MatchedTransactionModel.findOne is not a function"
  const pendingMatchedTransaction = await MatchedTransactionModel.findOne({
    $and: [
      {
        $or: [
          { reserverAccountId: `${account._id}` },
          { sellerAccountId: `${account._id}` },
        ],
      },
      {
        $or: [
          { status: 'pendingReserverPayment' },
          { status: 'pendingSellerConfirmation' },
        ],
      },
    ],
  });
  // ...
}

module.exports = {
  banPlayer,
};

моделей / согласованных транзакций. js

const mongoose = require('mongoose');
const { banPlayer } = require('../sharedApi/player');
const MatchedTransactionSchema = new mongoose.Schema([
  {
    createdDate: {
      type: Date,
      required: true,
    },
    // ...
  },
]);

MatchedTransactionSchema.post('init', async function postInit() {
    // ...
    await banPlayer(userId);
});

const MatchedTransactionModel = mongoose.model('matchedTransactions', MatchedTransactionSchema);
module.exports = MatchedTransactionModel;

Обратите внимание, что в player. js, когда я пытался console.log требуемый MatchedTransactionModel, он возвращает пустой объект. Однако, если я внес следующие изменения в matchedTransaction. js:

models / matchedTransaction. js

// Instead of requiring banPlayer outside, I only require it when it is used
// const { banPlayer } = require('../sharedApi/player');

MatchedTransactionSchema.post('init', async function postInit() {
    // ...
    const { banPlayer } = require('../sharedApi/player');
    await banPlayer(userId);
});
// ...

вывод вышеупомянутого console.log будет непустым объектом, а MatchedTransactionModel.findOne работает как положено.

Почему это происходит?

1 Ответ

0 голосов
/ 28 января 2020

Единственная проблема, которую я вижу с вашим кодом, состоит в том, что когда вы определяете схему на matchedTransaction.js, вы передаете массив, который, я думаю, проблематичен c и не имеет смысла. Вы должны передать туда объект:

const MatchedTransactionSchema = new mongoose.Schema({
  createdDate: {
    type: Date,
    required: true,
  },
  // ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...