创建 mongoose 模型库无法导入

雷克斯

我一直在尝试创建一个包含 mongo 模型和助手类的库,然后将其作为 npm 模块与我团队的其他成员共享。我遇到的问题是我从 lib MongoConnector 导入的主要代码,它处理配置信息并连接到 mongo,我还导入 Model1 并找到所有调用的工作。但是当我从同一个库中导入 Poller 并将其传递给 Model1 时,当它找到时,承诺永远不会返回。

库有 4 个文件

模型1.ts:

import mongoose from 'mongoose';

export interface IModel1 {
    draftId: string;
    [k:string]: any;
}

export interface IModel1DocumnetAttrs {
    draftId: string;
    data: string;
    createdBy?: String;
}

export interface IModel1Document extends mongoose.Document {
    draftId: String;
    createdBy: String;
    data: string;
}

export type IModel1Model = mongoose.Model<IModel1Document>;

const schema = new mongoose.Schema(
    {
        draftId: {type: String, index: {unique: true }},
        createdBy: String,
        data: String,
    },
    { versionKey: false, strict: false, timestamps: true, },
);

export const Model1: IModel1Model = mongoose.model<IModel1Document, IModel1Model>('Model1', schema);

MongoPoller.ts:

import * as Logger from 'bunyan';
import * as _ from 'lodash';
import mongoose from 'mongoose';

export type IMongoPollerCallback<T extends mongoose.Document> = (error: Error | undefined, docs?: T[]) => void;

export class MongoPoller<T extends mongoose.Document> {
    private query: any;
    private callback: IMongoPollerCallback<T>;
    private intervalId: any;
    private readonly log: Logger;
    constructor(private readonly pollingTime: number, private readonly model: typeof mongoose.Model, baseLogger: Logger) {
        this.callback = _.noop;
        this.log = baseLogger.child({ component: 'MongoPoller' });
    }

    public start(query: any, callback: IMongoPollerCallback<T>) {
        this.query = query;
        this.callback = callback;

        this.intervalId = setInterval(() => this.workFunction(), this.pollingTime);
    }

    public stop() {
        clearInterval(this.intervalId);
    }

    public async initial(query: any, callback: IMongoPollerCallback<T>) {
        this.query = query;
        this.callback = callback;
        this.log.info(`Mongo Poller started with initial, ${JSON.stringify(query)}`);

        return this.workFunction();
    }

    public continue() {
        this.log.info(`Mongo Poller told to continue, ${JSON.stringify(this.query)}`);
        this.intervalId = setTimeout(() => this.workFunction(), this.pollingTime);
    }

    private async workFunction() {
        try{
            this.log.info(`Mongo Poller executing workFunction, ${JSON.stringify(this.query)}`);
            const docsp =  this.model.find(this.query).exec();
            const docs = await docsp;
            this.log.info(`Mongo Poller executing workFunction callback with ${docs.length} docs, ${JSON.stringify(this.query)}`);

            this.callback(undefined, docs)

        }
        catch (e){
            this.log.info(`Mongo Poller executing workFunction callback with ERROR ${e.message}, ${JSON.stringify(this.query)}`);
            this.callback(undefined)
        }

    }
}

MongoDBConnector.ts:

import Promise = require('bluebird');
import * as Logger from 'bunyan';
import mongoose from 'mongoose';
import { decrypt, IKeyData } from './cryptoUtils';

interface IMongoDatabaseConfig {
    uri?: string;
    fullUri?: string;
    options?: object;
    username?: string;
    password?: string;
    initialDelayMSec?: number;
    finalDelayMSec?: number;
    triesBeforeFinalDelay?: number;
    autoIndex?: boolean;
    debug?:boolean
}

export class MongoDBConnector {
    private readonly mongoConfig: IMongoDatabaseConfig = {};
    private connectionPromise: Promise<any> | undefined;
    private readonly log: Logger;
    constructor(config: IMongoDatabaseConfig, baseLogger: Logger, keyData: IKeyData) {
        this.mongoConfig = config;
        mongoose.set('debug', this.mongoConfig.debug);
        mongoose.set('autoCreate', true);
        this.log = baseLogger.child({ component: 'MongoDBConnector' });
        Object.assign(this.mongoConfig, config);
        if (
            !this.mongoConfig.username ||
            this.mongoConfig.username.trim() === '' ||
            !this.mongoConfig.password ||
            this.mongoConfig.password.trim() === ''
        ) {
            this.mongoConfig.fullUri = `mongodb://${this.mongoConfig.uri}`;
        } else {
            this.mongoConfig.fullUri = `mongodb://${this.mongoConfig.username}:${decrypt(
                this.mongoConfig.password,keyData
            )}@${this.mongoConfig.uri}`;
        }
        this.mongoConfig.autoIndex = true;

        mongoose.Promise = global.Promise;
    }

    private connectToMongo(numTries: number = 1): any {
        return mongoose
            .connect(<string>this.mongoConfig.fullUri, this.mongoConfig.options)
            .then(() => {
                this.log.info('MongoDB Connected!');

                return mongoose.connection;
            })
            .catch((error: any) => {
                const timeoutDelayMSec =
                    numTries < <number>this.mongoConfig.triesBeforeFinalDelay
                        ? this.mongoConfig.initialDelayMSec
                        : this.mongoConfig.finalDelayMSec;
                this.log.error(`Issue connecting to MongoDB: ${error.message}`);
                this.log.info(
                    `Retrying connection to MongoDB (attempt #${numTries}). Reconnecting in ${timeoutDelayMSec} ms...`,
                );

                return Promise.delay(<number>timeoutDelayMSec).then(() => {
                    return this.connectToMongo(numTries + 1);
                });
            });
    }

    public connect() {
        if (!this.connectionPromise) {
            this.log.info(`Attempting to connect to MongoDB on ${this.mongoConfig.fullUri}`);
            this.connectionPromise = this.connectToMongo().catch((error: any) => {
                this.connectionPromise = undefined;
                throw error;
            });
        }

        return this.connectionPromise;
    }
}

索引.ts:

export { Model1 } from './Model1';
export { MongoDBConnector} from './MongoDBConnector';
export {IMongoPollerCallback, MongoPoller}  from './MongoPoller';

主要应用程序:

索引.ts:

import * as config from './config/config.json';
import * as keyEventLogger from './logging/keyEventLogger';
import { loggerFactory } from './logging/loggerFactory';


import {
    DraftJudgment,
    IDraftDocument,
    IMongoPollerCallback,
    MongoDBConnector,
    MongoPoller
} from 'exploitmongomodels';

import mongoose from 'mongoose';

import { Promise as bluebird } from 'bluebird';
import * as keyData from './key.json';

global.Promise = bluebird;

const log = loggerFactory('main');

async function main() {
    // adding better logging for uncaught rejected promises
    process.on('unhandledRejection', err => {
        log.fatal({ err }, 'uncaught rejection');
    });

    process.on('uncaughtException', err => {
        log.fatal({ err }, 'uncaught exception');
    });

    const mongo = new MongoDBConnector(config.database.mongo, log, keyData);

    await mongo.connect();

    keyEventLogger.logKeyEvent(keyEventLogger.keyEvents.heartBeat, '');

    const d = await DraftJudgment.find({}).exec();
    console.log(d.length); //<- this prints 3
    //const j2 = mongoose.model('DraftJudgment');  <-- this throws an error

    //Set up heart beat for log files
    setInterval(
        () => keyEventLogger.logKeyEvent(keyEventLogger.keyEvents.heartBeat, ''),
        config.logger.heartbeatInterval,
    );

    const judgmentSubmitPoller = new MongoPoller<IDraftDocument>(config.pollingDurationInSec, DraftJudgment, log);

    const judgmentSubmitPollingCB: IMongoPollerCallback<IDraftDocument> = (
        error: Error | undefined,
        docs?: IDraftDocument[],
    ) => {
        if (error) {
            log.error(error, 'Error during judgment mongo polling');
            judgmentSubmitPoller.continue();

            return;
        }
        log.info(`Submit poller triggered submitted judgments`);
        if (!docs) {
            return;
        }
        //do something with the docs object

        log.info(`Submit poller triggered with ${docs.length} submitted judgments`);

        judgmentSubmitPoller.continue();
    };
    judgmentSubmitPoller.initial({ status: 'submitted' }, judgmentSubmitPollingCB);

    const judgmentPendingPoller = new MongoPoller<IDraftDocument>(config.pollingDurationInSec, DraftJudgment, log);

    const judgmentPendingPollingCB: IMongoPollerCallback<IDraftDocument> = (
        error: Error | undefined,
        docs?: IDraftDocument[],
    ) => {
        if (error) {
            log.error(error, 'Error during judgment mongo polling');
            judgmentSubmitPoller.continue();

            return;
        }
        if (!docs) {
            return;
        }

        //do something with the docs object

        log.info(`Pending poller triggered with ${docs.length} submitted judgments`);

        judgmentPendingPoller.continue();
    };
    //judgmentPendingPoller.initial({ $query: { status: 'pending' } }, judgmentPendingPollingCB);

    //tslint:disable-next-line
    while (true) {}
}

main();

在 MongoPoller#workFunction 中,docsp promise 永远不会解决。

雷克斯

所以这有点尴尬,问题是 main 底部的 while 循环。由另一个开发者添加;我们都认为需要防止节点退出。好吧,事实并非如此,而且因为循环太紧了,它决不允许时间来解决承诺。

活到老,学到老。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用mongoose.connect并创建一个mongoose模型后没有出现Mongoose数据库

来自分类Dev

MongoDB / mongoose在两个模型之间创建关系?

来自分类Dev

导入的成员无法创建猫鼬模型

来自分类Dev

Python cPickle无法加载OCR模型库

来自分类Dev

停止 Mongoose 创建自动索引

来自分类Dev

使用mongodb-memory-server和mongoose创建内存数据库

来自分类Dev

MongoDB VS MySQL-为什么mongo / mongoose自动创建数据库和集合?

来自分类Dev

Java广义线性模型库

来自分类Dev

如何为$ near查询创建Mongoose模式

来自分类Dev

Mongoose 模式创建空数组字段

来自分类Dev

使用 mongoose/mongoDB 创建/更新对象

来自分类Dev

Mongoose 直接填充创建子文档

来自分类Dev

如何从 JSON 创建 Mongoose 模式键

来自分类Dev

从 mongoose.find() 创建对象集

来自分类Dev

在Mongoose中更新/创建模型时,有什么理由将用户输入的数据列入白名单?

来自分类Dev

在Mongoose中更新/创建模型时,出于什么原因将用户输入的数据列入白名单?

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

无法导入最近创建的包

来自分类Dev

从多个Mongoose模型返回数据

来自分类Dev

Mongoose 模型对象行为异常

来自分类Dev

Mongoose 如何更新嵌套模型?

来自分类Dev

为外部导入的表创建django模型

来自分类Dev

MongoDB和Mongoose:Mongoose可以在创建参考文档之前先映射参考文档吗?

来自分类Dev

使用细分模型库时出现的问题

来自分类Dev

创建一个支持回调和Promise的Mongoose插件

来自分类Dev

如何知道Mongoose的upsert是否创建了新文档?

来自分类Dev

在Mongoose中按创建日期对引用的架构进行排序

Related 相关文章

  1. 1

    使用mongoose.connect并创建一个mongoose模型后没有出现Mongoose数据库

  2. 2

    MongoDB / mongoose在两个模型之间创建关系?

  3. 3

    导入的成员无法创建猫鼬模型

  4. 4

    Python cPickle无法加载OCR模型库

  5. 5

    停止 Mongoose 创建自动索引

  6. 6

    使用mongodb-memory-server和mongoose创建内存数据库

  7. 7

    MongoDB VS MySQL-为什么mongo / mongoose自动创建数据库和集合?

  8. 8

    Java广义线性模型库

  9. 9

    如何为$ near查询创建Mongoose模式

  10. 10

    Mongoose 模式创建空数组字段

  11. 11

    使用 mongoose/mongoDB 创建/更新对象

  12. 12

    Mongoose 直接填充创建子文档

  13. 13

    如何从 JSON 创建 Mongoose 模式键

  14. 14

    从 mongoose.find() 创建对象集

  15. 15

    在Mongoose中更新/创建模型时,有什么理由将用户输入的数据列入白名单?

  16. 16

    在Mongoose中更新/创建模型时,出于什么原因将用户输入的数据列入白名单?

  17. 17

    无法在Django 1.7中创建South数据库模型

  18. 18

    无法在Django 1.7中创建South数据库模型

  19. 19

    无法在Django 1.7中创建South数据库模型

  20. 20

    无法导入最近创建的包

  21. 21

    从多个Mongoose模型返回数据

  22. 22

    Mongoose 模型对象行为异常

  23. 23

    Mongoose 如何更新嵌套模型?

  24. 24

    为外部导入的表创建django模型

  25. 25

    MongoDB和Mongoose:Mongoose可以在创建参考文档之前先映射参考文档吗?

  26. 26

    使用细分模型库时出现的问题

  27. 27

    创建一个支持回调和Promise的Mongoose插件

  28. 28

    如何知道Mongoose的upsert是否创建了新文档?

  29. 29

    在Mongoose中按创建日期对引用的架构进行排序

热门标签

归档