Проблема с typescript в промежуточном программном обеспечении для возврата по умолчанию в nodejs express

#javascript #node.js #typescript #express #middleware

#javascript #node.js #typescript #экспресс #промежуточное программное обеспечение

Вопрос:

У меня есть промежуточное программное обеспечение, которое стандартизирует ответы. Вот код:

responses.js

 const TYPE_JSON = 'application/json';
const STATUS_CODE_OK = 200;
const STATUS_CODE_CREATED_SUCCESSFULLY = 201;
const STATUS_CODE_BAD_REQUEST = 400;
const STATUS_CODE_UNAUTHORIZED = 401;
const STATUS_CODE_NOT_FOUND = 404;
const STATUS_CODE_SERVER_ERROR = 500;

const jsonOK = function (data, message) {
    const status = STATUS_CODE_OK;

    message = message ? message : 'Successful request.';

    this.status(STATUS_CODE_OK);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const jsonCreated = function (data, message) {
    const status = STATUS_CODE_CREATED_SUCCESSFULLY;

    message = message ? message : 'Created successfully.';

    this.status(STATUS_CODE_CREATED_SUCCESSFULLY);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
}

const jsonBadRequest = function (data, message) {
    const status = STATUS_CODE_BAD_REQUEST;

    message = message ? message : 'Bad request.';

    this.status(STATUS_CODE_BAD_REQUEST);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const jsonNotFound = function (data, message) {
    const status = STATUS_CODE_NOT_FOUND;

    message = message ? message : 'Not found.';

    this.status(STATUS_CODE_NOT_FOUND);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const response = (req, res, next) => {
    res.jsonOK = jsonOK;
    res.jsonCreated = jsonCreated;
    res.jsonBadRequest = jsonBadRequest;

    next();
};

module.exports = response;
  

Итак, в моих контроллерах я называю это так:

 router.get('/', (request, response) => {
   return response.jsonOK();
})
  

Но недавно я начал переносить свой проект на typescript, так что…

 import { Request, Response, NextFunction } from 'express';

const TYPE_JSON = 'application/json';
const STATUS_CODE_OK = 200;
const STATUS_CODE_CREATED_SUCCESSFULLY = 201;
const STATUS_CODE_BAD_REQUEST = 400;
const STATUS_CODE_UNAUTHORIZED = 401;
const STATUS_CODE_NOT_FOUND = 404;
const STATUS_CODE_SERVER_ERROR = 500;

const jsonOK = function (data: any, message: string) {
    const status = STATUS_CODE_OK;

    message = message ? message : 'Successful request.';

    this.status(STATUS_CODE_OK);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const jsonCreated = function (data: any, message: string) {
    const status = STATUS_CODE_CREATED_SUCCESSFULLY;

    message = message ? message : 'Created successfully.';

    this.status(STATUS_CODE_CREATED_SUCCESSFULLY);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
}

const jsonBadRequest = function (data: any, message: string) {
    const status = STATUS_CODE_BAD_REQUEST;

    message = message ? message : 'Bad request.';

    this.status(STATUS_CODE_BAD_REQUEST);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const jsonNotFound = function (data: any, message: string) {
    const status = STATUS_CODE_NOT_FOUND;

    message = message ? message : 'Not found.';

    this.status(STATUS_CODE_NOT_FOUND);
    this.type(TYPE_JSON);

    return this.json({ message, data, status: status });
};

const response = (req: Request, res: Response, next: NextFunction) => {
    res.jsonOK = jsonOK;
    res.jsonCreated = jsonCreated;
    res.jsonBadRequest = jsonBadRequest;

    next();
};

module.exports = response;
  

Но он жалуется на множество вещей, таких как:

  • это. имеет неявный тип any
  • jsonOK, jsonCreated, jsonBadRequest не найдены в типе Response

Итак, больше ничего не работает, как я могу это исправить?

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

1. Вы не указываете возвращаемое значение в вашем TypeScript для своих методов jsonCreated() , jsonBadRequest() и т.д., Но вы возвращаете значение с помощью таких операторов, как return this.json({ message, data, status: status }); . Эти два параметра должны совпадать. Или, если вам на самом деле не нужно возвращаемое значение из них, тогда удалите return из return this.json(...) и не указывайте никакого возвращаемого значения.

2. К вашему сведению, хотя это не задокументировано, res.json() вероятно, просто возвращает, res чтобы вы могли указать Response объект в качестве возвращаемого значения, и если вы посмотрите на исходный код Express , похоже, что это то, что он возвращает.

3. Я не очень хорошо понял решение @jfriend00.