У меня проблема с тем, что 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()
.