Необработанное отклонение (ошибка типа): не удается прочитать свойство ‘call’ неопределенного

#javascript #reactjs #webpack #typeerror

#javascript #reactjs #webpack #ошибка типа

Вопрос:

Я прочитал все, что нашел, я даже добрался до второй страницы Google. Я удалил node_module s и после npm install . У меня все время возникает это:

 Unhandled Rejection (TypeError): Cannot read property 'call' of undefined
_callee$
C:/src/client/proxy.ts:28
  25 |   });
  26 | }
  27 | 
> 28 | export async function call<RESULT>(method: string, ...params: any[]) {
  29 |   return rpc.call<RESULT>(method, ...params);
  30 | }
  31 | 
 

Фрагмент кода, который вы видите, является частью SDK, который я использую.
Точно такие же функции используются в учебном пособии, которое я скачал. Если я запускаю учебник, он работает,
в то время как если я запускаю свой React.js веб-приложение, в котором я получаю сообщение об ошибке.

Я сравнил package.json файлы, и они имеют одинаковые зависимости.

У меня мало опыта, поэтому я не знаю, полезно ли это: tsconifg.json файлы разные.

Это proxy.ts:

 import { WindowPostMessageProxy } from '@ont-community/window-post-message-proxy';
import { Rpc } from '../rpc/rpc';

let windowProxy: WindowPostMessageProxy;
let rpc: Rpc;

export function registerClient({
  logMessages = false,
  logWarnings = false
}: {
  logMessages?: boolean;
  logWarnings?: boolean;
}) {
  windowProxy = new WindowPostMessageProxy({
    name: 'page',
    target: 'content-script',
    logMessages,
    suppressWarnings: !logWarnings
  });
  rpc = new Rpc({
    source: 'page',
    destination: 'background',
    logMessages: false,
    postMessage: windowProxy.postMessage.bind(windowProxy, window)
  });
}

export async function call<RESULT>(method: string, ...params: any[]) {
  return rpc.call<RESULT>(method, ...params);
}
 

rpc.ts:

 import { Caller, Tunnel, TunnelOptions } from './tunnel';

export type MethodType = (...params: any[]) => any;

interface MethodCallType {
  method: string;
  params: any[];
}

export class Rpc {
  private tunnel: Tunnel<MethodCallType>;
  private methods: Map<string, MethodType>;

  constructor(options: TunnelOptions) {
    options.messageHandler = this.messageHandler.bind(this);

    this.tunnel = new Tunnel(options);
    this.methods = new Map();
  }

  call<RESULT = any>(method: string, ...params: any[]) {
    const msg = {
      method,
      params
    };

    return this.tunnel.send<RESULT>(msg);
  }

  register(name: string, method: MethodType) {
    this.methods.set(name, method);
  }

  private messageHandler(msg: MethodCallType, caller: Caller) {
    const method = this.methods.get(msg.method);

    if (method === undefined) {
      throw new Error('Unregistered method call: '   msg.method);
    }

    return method.call(caller, ...msg.params);
  }
}
 

Комментарии:

1. rpc не определен… где создается экземпляр rpc?

2. не могли бы вы записать весь файл proxy.ts?

3. Я редактировал весь файл proxy.ts

4. @DarioRega готово!

5. rpc из модуля узла или пользовательского? если пользовательское, пожалуйста, покажите код тоже