Плагин Rxdb: Использование метода RxCollectionBase # insert в плагине - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь создать плагин для rxdb. Я хочу перехватить исключение, вызванное insert, и вернуть хеш с {[fieldName: string] => [error:string]}

При использовании моего нового метода я получаю исключение, и кажется, что метод вызывается непосредственно впрототип, а не на каждом RxColletion<T, T2, T3> экземпляре.

Я получаю ошибку:

TypeError: Cannot read property 'fillObjectWithDefaults' of undefined

, что происходит здесь: https://github.com/pubkey/rxdb/blob/ac9fc95b0eda276110f371afca985f949275c3f1/src/rx-collection.ts#L443

, поскольку this.schemaundefined .. Коллекция, на которой я запускаю этот метод, имеет схему, хотя ..

Вот мой код плагина:

export const validatedInsertPlugin: RxPlugin = {
    rxdb: true,
    prototypes: {
        RxCollection(proto: IRxCollectionBaseWithValidatedInsert) {
            proto.validatedInsert = async function validatedInsert<T, D>(
                doc: T
            ): Promise<Insert<T>> {
                try {
                    // this is the line that raises:
                    const product = await proto.insert(doc);
                    return [true, product];
                } catch (e) {
                    // extract errors
                    return [false, {} as Errors<T>];
                }
            };
        },
    },
    overwritable: {},
    hooks: {},
};

1 Ответ

1 голос
/ 02 октября 2019

Чтобы ответить на мой собственный вопрос,

proto.insert нацеливается на прототип, а это не то, что я хочу. function(this: RxCollection) это то, что я хочу. Я должен использовать this, который будет нацелен на фактический экземпляр.

proto.validatedInsert = async function validatedInsert<T1>(
                this: RxCollection,
                doc: T1
            ): Promise<ValidatedInsert<T1>> {
                try {
                    const product = await this.insert(doc); // this, not proto
                    return [true, product];
                } catch (e) {
    ...

...