Mongoose Заполняет сообщение об ошибке «Uncaught TypeError: query.exec не является функцией» - PullRequest
0 голосов
/ 17 мая 2019

У меня проблема с тем, что Mongoose выдает случайные ошибки, которые .populate() или .exec() в функции заполнения не являются функциями.

Я изначально использовал Mongoose v4.13.18 при разработке этого APIна местном уровне.Все работало месяцами, и я все настроил, используя Azure Kubernetes Service и Azure CosmosDB (управляемый mongodb).На живом сервере я начал получать сообщения о том, что заполнение не является функцией, как показано ниже:

TypeError: user_1.User.findOne(...).populate is not a function
    at /usr/src/app/dist/controllers/users.controller.js:307:55
    at new Promise (<anonymous>)
    at Function.UsersController.login_user (/usr/src/app/dist/controllers/users.controller.js:304:16)
    at Object.<anonymous> (/usr/src/app/dist/routes/user.routes.js:239:65)
    at step (/usr/src/app/dist/routes/user.routes.js:40:23)
    at Object.next (/usr/src/app/dist/routes/user.routes.js:21:53)
    at /usr/src/app/dist/routes/user.routes.js:15:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/src/app/dist/routes/user.routes.js:11:12)
    at /usr/src/app/dist/routes/user.routes.js:229:52
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at next (/usr/src/app/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at /usr/src/app/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)

Я обновился до Mongoose 5.5.9, чтобы посмотреть, исправит ли это ошибку, а затем внезапно всю мою интеграцию.тесты начинают взрываться с ошибками вроде:

Uncaught TypeError: query.exec is not a function
      at populate (node_modules/mongoose/lib/model.js:4024:11)
      at _populate (node_modules/mongoose/lib/model.js:3884:5)
      at utils.promiseOrCallback.cb (node_modules/mongoose/lib/model.js:3857:5)
      at Object.promiseOrCallback (node_modules/mongoose/lib/utils.js:248:12)
      at Function.Model.populate (node_modules/mongoose/lib/model.js:3856:16)
      at model.Query.Query._completeOne (node_modules/mongoose/lib/query.js:1995:9)
      at Immediate.Query.base.findOne.call (node_modules/mongoose/lib/query.js:2032:10)
      at Immediate.<anonymous> (node_modules/mquery/lib/utils.js:116:16)

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

Mutation.findOne({ carrier: my_carrier_id, model: "Carrier" }, (err, mutation) => {
            expect(err).to.be.null;
            expect(mutation).to.not.be.null;
            expect(mutation).to.have.property('model', 'Carrier');
            expect(mutation).to.have.property('change', `Created new carrier called ${new_test_carrier.name}`);
            expect(mutation).to.have.property('operation', 'create');

            done();
        });

Модель Mutation - это экспортированный вызов mongoose.model(), и она работает довольно давнотолько взорвать при обновлении Mongoose.Как ни странно, когда я опустился до версии v4.13.18, продолжала появляться та же самая ошибка.

import * as mongoose from "mongoose";
import * as immutable from "mongoose-immutable";
import * as autopopulate from "mongoose-autopopulate";
const Schema = mongoose.Schema;

const MutationSchema = new Schema({
    carrier: {
        type: Schema.Types.ObjectId,
        ref: 'Carrier',
        index: true,
        immutable: true,
    },
    acting_user: {
        type: Schema.Types.ObjectId,
        ref: 'User', 
        index: true,
        immutable: true,
        autopopulate: true,
    },
    model: String,
    id: String,
    change: {
        type: Schema.Types.Mixed,
    },
    operation: {
        type: String,
        enum: ['create', 'update', 'delete'],
        immutable: true,
    },
});

MutationSchema.plugin(immutable);
MutationSchema.plugin(autopopulate);

export const Mutation = mongoose.model('Mutation', MutationSchema);

К которой я затем обращаюсь с помощью

Mutation.findOne({ carrier: my_carrier_id, model: "Carrier" }, (err, mutation) => {
            expect(err).to.be.null;
            expect(mutation).to.not.be.null;
            expect(mutation).to.have.property('model', 'Carrier');
            expect(mutation).to.have.property('change', `Created new carrier called ${new_test_carrier.name}`);
            expect(mutation).to.have.property('operation', 'create');

            done();
        });

Я ожидаю, что вывод вызоветобратный вызов .findOne() и либо выдаст мне ошибку, либо выдаст записи.Не ошибка, говоря, что query.exec не является функцией в функции .populate().

...