繁体   English   中英

`TypeError:无法读取未定义的属性(阅读`<typescript_attributes> ')`</typescript_attributes>

[英]`TypeError: Cannot read properties of undefined (reading `<typescript_attributes>')`

我是 typescript 的新手。 我收到这样的错误:

TypeError: Cannot read properties of undefined (reading '_service')
  at ...
  at ...
  at ...

尝试调用getNotesHandler() function 时。 这是一个完整的代码:

import { Request, ResponseObject, ResponseToolkit } from "@hapi/hapi";
import { ClientError } from "../../exceptions/ClientError";
import { NotesService } from "../../services/inMemory/NotesService";
import { notesValidator, NotesValidator } from "../../validator/notes";

export class NotesHandler {
  _service: NotesService = new NotesService();
  _validator: NotesValidator;
  
  constructor(service: NotesService, validator: NotesValidator) {
    this._service = service;
    this._validator = validator;
    console.log('Service initialized', this._service)
    console.log('Validator initialized', this._validator)
  }

  postNoteHandler(request: Request, h: ResponseToolkit): ResponseObject {
    try {
      this._validator.validateNotePayload(request.payload);
      const data: NoteInput = JSON.parse(request.payload.toString());

      const noteId = this._service.addNote(data.title, data.body, data.tags);

      const response = h.response({
        status: 'success',
        message: `Note with id ${noteId} was added`,
        data: {
          noteId,
        }
      });

      response.code(201);
      return response;
    } catch(error) {
      if (error instanceof ClientError) {
        const response = h.response({
          status: 'error',
          message: error.message,
        });

        response.code(error.statusCode);
        return response;
      }

      // Server Error
      const response = h.response({
        status: 'error',
        message: 'Internal server error',
      });
      response.code(500);
      console.error(error);
      return response;
    }
  }

  getNotesHandler(request: Request, h: ResponseToolkit): ResponseObject {
    console.log("getNotesHandler");
    const notes = this._service.getNotes();
    const response = h.response({
      status: 'success',
      message: 'Notes were retrieved',
      data: notes,
    });
    response.code(200);
    return response;
  }

  getNoteByIdHandler(request: Request, h: ResponseToolkit): ResponseObject {
    try {
      const noteId = request.params.id;
      const note = this._service.getNoteById(noteId);
      const response = h.response({
        status: 'success',
        data: {
          note,
        }
      });
      response.code(200);
      return response;
    } catch(error) {
      if (error instanceof ClientError) {
        const response = h.response({
          status: 'error',
          message: error.message,
        });

        response.code(error.statusCode);
        return response;
      }

      // Server Error
      const response = h.response({
        status: 'error',
        message: 'Internal server error',
      });
      response.code(500);
      console.error(error);
      return response;
    }
  }

  putNoteByHandler(request: Request, h: ResponseToolkit): ResponseObject {
    try {
      this._validator.validateNotePayload(request.payload);
      const noteId = request.params.id;

      this._service.editNoteById(
        noteId, JSON.parse(request.payload.toString())
      );

      const response = h.response({
        status: 'success',
        message: `Note with id ${noteId} was edited`,
      });
      return response;
    } catch(error) {
      if (error instanceof ClientError) {
        const response = h.response({
          status: 'fail',
          message: error.message,
        });
        response.code(error.statusCode);
        return response;
      }
 
      // Server ERROR!
      const response = h.response({
        status: 'error',
        message: 'Server goes error.',
      });
      response.code(500);
      console.error(error);
      return response;
    }
  }

  deleteNoteByIdHandler(request: Request, h: ResponseToolkit): ResponseObject {
    try {
      const noteId = request.params.id;
      this._service.deleteNoteById(noteId);
      const response = h.response({
        status: 'success',
        message: `Note with id ${noteId} was deleted`,
      });
      return response;
    } catch(error) {
      if (error instanceof ClientError) {
        const response = h.response({
          status: 'fail',
          message: error.message,
        });
        response.code(error.statusCode);
        return response;
      }
 
      // Server ERROR!
      const response = h.response({
        status: 'error',
        message: 'Server goes error.',
      });
      response.code(500);
      console.error(error);
      return response;
    }
  }

如果值undefined ,我还尝试在constructor()中使用console.log(this._service) 但不幸的是没有。 它在我的控制台中给出了 output :

Service initialized NotesService { _notes: [] }
Validator initialized { validateNotePayload: [Function: validateNotePayload] }

仍然困惑为什么_service在调用getAllNotes()undefined _validator属性发生了同样的问题,并且发生在NotesHandler class 中的另一个函数/属性中。 提前致谢

该错误没有说明_serviceundefined

它说你正在尝试做undefined._service所以this必须是undefined

在某处传递getNotesHandler时,您可能会丢失this上下文。 尝试使用bind

此外,它与 TypeScript 无关,因为 TypeScript 在运行时不存在。 这是严格的 JavaScript 错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM