Website-Suche

javascript - Der Standardsanitizer von Express-validator funktioniert nicht, wenn er verkettet wird


Ich habe Probleme bei der Verwendung des default()-Sanitizers von express-validator. Wenn ich ihn in einer Kette benutze, wie zum Beispiel body("children").optional().isArray().default([]), funktioniert die default-Funktion nicht, sodass children undefined bleibt. Wenn ich diese jedoch in zwei getrennte Anweisungen aufteile (indem ich einen separaten body("children").default([])-Sanitizer hinzufüge, anstatt ihn mit den anderen zu verketten), funktioniert es einwandfrei. Hier ist ein minimales reproduzierbares Beispiel...

import express from "express";
import { body } from "express-validator";

const app = express();

app.use(express.json());

app.post(
  "/fails",
  body("children").isArray().optional().default([]),
  (req: express.Request) => {
    console.log(`/fails output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.post(
  "/works",
  body("children").isArray().optional(),
  body("children").default([]),
  (req: express.Request) => {
    console.log(`/works output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.listen(3000);

...das, zusammen mit diesen Bibliotheken verwendet...

@types/[email 
[email 
[email 
[email 

...gibt diese Ausgabe:

/fails output: {}
/works output: {
    "children": []
}

Beide POST-Anfragen hatten einen leeren Body (ich benutze Postman, um dies zu testen).

Warum passiert das? Ich habe versucht, die Prüfungen optional, isArray und default zu variieren, aber ohne Erfolg. Obwohl /works, nun ja, funktioniert, möchte ich die gleiche body-Anweisung nicht zweimal für jeden optionalen Standardwert in meinem Schema duplizieren.

Weiß jemand, wie man dieses Problem behebt?

Antwort #1

Das Problem ist, dass der optionale Validator die Validierungskette komplett ignoriert, wenn der Wert undefiniert ist.

Sie müssen entscheiden, ob Sie das Feld children als Standardwert [] benötigen, selbst wenn es im Body vollständig fehlt. Und dann optional entfernen. Oder Sie können ohne es weitermachen und dann default entfernen.

Antwort #2

Wenn man .optional() aus der Kette entfernt, funktioniert es. Also dieser Code:

import express from "express";
import { body } from "express-validator";

const app = express();

app.use(express.json());

app.post(
  "/fails",
  body("children").isArray().default([]),
  (req: express.Request) => {
    console.log(`/fails output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.post(
  "/works",
  body("children").isArray().optional(),
  body("children").default([]),
  (req: express.Request) => {
    console.log(`/works output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.listen(3000);

Gibt die korrekte Ausgabe sowohl für /fails als auch für /works. Allerdings habe ich keine Ahnung, warum das passiert! Warum kann ich nicht .optional().default([]) machen? Warum ist das nicht dokumentiert? Ich habe hier auf GitHub einen Fehlerbericht erstellt, falls jemand interessiert ist.