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.
