#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.