javascript - ตัวทำความสะอาดเริ่มต้นของ Express-validator ไม่ทำงานเมื่อถูกเชื่อมต่อแบบ chain
ฉันกำลังมีปัญหาในการใช้ตัวทำความสะอาด default() จาก express-validator เมื่อฉันใช้มันในลำดับ เช่น body("children").optional().isArray().default([]) ฟังก์ชัน default จะไม่ทำงานใด ๆ ทำให้ children เป็น undefined อย่างไรก็ตาม ถ้าฉันแยกเป็นสองคำสั่งต่างหาก (เพิ่มตัวทำความสะอาด body("children").default([]) แยกต่างหากแทนที่จะต่อกับอันอื่น) มันจะทำงานได้อย่างสมบูรณ์ นี่คือตัวอย่างที่ทำซ้ำได้อย่างน้อย...
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);
...ซึ่งใช้ร่วมกับห้องสมุดเหล่านี้...
@types/[email
[email
[email
[email
...ให้ผลลัพธ์นี้:
/fails output: {}
/works output: {
"children": []
}
คำร้องขอ POST ทั้งคู่มีเนื้อหาว่าง (ฉันกำลังใช้ Postman เพื่อทดสอบสิ่งนี้)
ทำไมสิ่งนี้ถึงเกิดขึ้น? ฉันได้พยายามสลับการตรวจสอบ optional, isArray, และ default แต่ก็ไม่ได้ผล แม้ว่า /works จะทำงานได้ แต่ฉันก็ไม่อยากทำซ้ำคำสั่ง body เดียวกันสองครั้งสำหรับค่าดีฟอลต์ที่เป็นทางเลือกแต่ละค่าในสคีมาของฉัน
มีใครรู้วิธีแก้ปัญหานี้ไหม?
คำตอบ #1
ปัญหาคือ optional validator จะละเลยสายการตรวจสอบทั้งหมดหากค่าคือ undefined
คุณต้องตัดสินใจว่าคุณต้องการให้ฟิลด์ children มีค่าเริ่มต้นเป็น [] แม้ว่าจะไม่มีอยู่ในเนื้อหาก็ตาม แล้วจึงลบ optional ออก หรือคุณอาจทำต่อไปโดยไม่ใช้มันแล้วจึงลบ default
คำตอบ #2
เมื่อเอา .optional() ออกจากโค้ดส่วนนี้ มันจะทำงาน ดังนั้นโค้ดนี้:
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);
ให้ผลลัพธ์ที่ถูกต้องสำหรับทั้ง /fails และ /works อย่างไรก็ตาม ผม/ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น! ทำไมผม/ฉันถึงไม่สามารถทำ .optional().default([]) ได้? ทำไมสิ่งนี้ถึงไม่มีเอกสาร? ผม/ฉันสร้างรายงานบั๊กบน GitHub ที่นี่ ถ้าใครสนใจ
