Измените ответ Express js, чтобы избежать некоторых определенных значений c - PullRequest
0 голосов
/ 17 января 2020

У меня есть приложение Express, которое возвращает большие десятичные числа (их текстовые представления) в ответ.

const app = express();
app.use('api_url', router); 

router.route('')
    .all(bodyParser.json())
    .all(function (req, res, next) {...})
.post((req, res) => {
    const response: CalcResponse = this.myService.getResponse(req);
    res.status(200).send(response);
});
...
app.use(bodyParser.json());

Проблема в том, что десятичные числа могут быть Infinity или NaN. Я хочу избежать таких значений в ответе и заменить их пустыми строками. response имеет тип CalcResponse, который является TypeScript классом. Есть ли способ заменить значения в промежуточном программном обеспечении?

Примерно так:

app.use((response) => response.replace(/(Infinity|NaN)/g, ''));

1 Ответ

1 голос
/ 17 января 2020

Рассматривали ли вы использование встроенной функции JavaScript isFinite?

  var a = isFinite(123)
  var b = isFinite(-1.23)
  var c = isFinite(5-2)
  var d = isFinite(0)
  var e = isFinite(NaN)
  var f = isFinite(Infinity)

console.log({a,b,c,d,e,f})

Поскольку я не знаю, какой тип ответа от вашей службы (числовое или строковое представление числа), я предоставлю 2 решения.

Для номера:

res.status(200).send(isFinite(response) ? response : "")

Для строкового решения вы предложили себе:

res.status(200).send(response.replace(/(Infinity|NaN)/g, ''))

Если вы сами не уверены в типе, вы можете упростить решение для обработки все они похожи на строки

res.status(200).send(response.toString().replace(/(Infinity|NaN)/g, ''))

Обычно JSON.stringify заменяет значения NaN и Infinity нулями, поэтому я бы предложил написать собственную функцию заменителя, чтобы заменить их на пустые строки, как в примере ниже

const data = {a: Infinity, b: NaN, c: 1, d: "test"}
function replacer(key, val){ 
  if (typeof val === "number" && !isFinite(val)) return ""
  return val;
}

const stringified = JSON.stringify(data, replacer);

console.log(stringified)

Даже если они на самом деле являются строками типа "Infinity" или "NaN", вы все равно можете использовать функцию заменителя для достижения аналогичных результатов

const data = {a: "Infinity", b: "NaN", c: 1, d: "test"}
function replacer(key, val){ 
  if (val === "Infinity" || val === "NaN") return ""
  return val;
}

const stringified = JSON.stringify(data, replacer);

console.log(stringified)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...