ค้นหาเว็บไซต์

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 ที่นี่ ถ้าใครสนใจ