Express/MongoDB/EJS - ไม่สามารถอ่านวัตถุได้

ดังนั้นฉันจึงมีข้อมูลบางส่วนในฐานข้อมูล Mongo ของฉัน ซึ่ง I.find() โดยแสดงและส่งไปยังมุมมอง EJS ของฉัน ค่อนข้างง่าย แต่ปัญหาคือเมื่อฉันพยายามอ่านโดยใช้ <pre><%=%></pre> ฉันไม่สามารถกำหนดได้ นี่คือโค้ดทั้งหมด:
อาร์เรย์ข้อมูลที่มีออบเจ็กต์ใน MongoDB:

[{
  _id: 6069820f402d01120cda8cff,
  imageName: 'Dining Plate',
  imagePath: './public/assets/img/6.jpg',
  description: 'Wallpapers',
  __v: 0
}]

รหัสด่วนที่ฉันได้รับและส่งไปที่ EJS:

app.get('/wallpapers/:id', ((req, res) => {
  const urlID = req.params.id;
  Thing.find({}, function (err, result) {
    if (err) {
      console.log(err);
    } else {
      var fres = result.filter(d => d._id == urlID);
      res.render('wallpaper-page',{fres});
    }
  });
})
)

และ EJS:

<pre><%= fres.description%> %> </pre>

และตอนนี้เกิดความสับสนครั้งใหญ่: เมื่อฉันแทนที่ fres.description ด้วย fres._id มันก็ทำงานได้ดีอย่างสมบูรณ์ เพียงเท่านี้ ไม่ต้องการพิมพ์ค่าคีย์อื่นใด ฉันค้นหาไปทั่วมาเกือบวันแล้ว แต่ไม่มีอะไรช่วยเลย ตอนนี้ทำให้ฉันรำคาญแล้ว

ป.ล.: console.log(fres.description) คือ undefined และ console.log(fres._id) ทำงานได้ดี

ทำไม ฉันจะแก้ไขปัญหานี้ได้อย่างไร? โปรดบอกฉันหากคุณต้องการรหัสอื่น ๆ


person MasterMind    schedule 04.04.2021    source แหล่งที่มา
comment
หากคุณต้องค้นหาด้วย ID ทำไมคุณไม่ลองใช้ Thing.findById(req.params.id) ล่ะ คุณบอกได้ไหมว่า console.log(fres) ให้อะไร?   -  person Som Shekhar Mukherjee    schedule 04.04.2021
comment
findbyid จะยังคงให้วัตถุแก่ฉัน console.log(fres) ให้วัตถุแก่ฉันด้วย{ _id: 6069820f402d01120cda8cff, imageName: 'Dining Plate', imagePath: './public/assets/img/6.jpg', description: 'Wallpapers', __v: 0 }   -  person MasterMind    schedule 04.04.2021
comment
โปรดดูคำตอบของฉัน แจ้งให้เราทราบหากช่วยได้ @lolman   -  person Som Shekhar Mukherjee    schedule 04.04.2021


คำตอบ (2)


นอกจากปัญหาเกี่ยวกับวิธีการกรองที่ส่งคืนอาร์เรย์แล้ว ฉันคิดว่าคุณมีปัญหาอื่นในการเข้าถึงข้อมูลจากการตอบสนองของ Mongoose

มีการพูดคุยถึงปัญหานี้ที่นี่: Mongoose ส่งคืนข้อมูลภายในวัตถุ _doc . คุณสามารถตรวจสอบคำตอบของฉันด้วยรหัสทดสอบเพื่อสาธิตวิธีการเข้าถึงข้อมูลจากการตอบสนองของ Mongoose

person Đăng Khoa Đinh    schedule 04.04.2021
comment
ใช่ นั่นคือสิ่งที่ฉันค้นพบตัวเองจริงๆ และใช้ .lean กับ .findOne ซึ่งช่วยแก้ไขมัน กำลังจะโพสที่นี่แล้วเจอสิ่งนี้ - person MasterMind; 05.04.2021

Array.filter ส่งคืนอาร์เรย์ ดังนั้น var fres = result.filter(d => d._id == urlID); ตัวแปร fres จึงเป็นอาร์เรย์ที่มีอ็อบเจ็กต์อยู่ในนั้น

และหากคุณต้องการเฉพาะออบเจ็กต์ในเทมเพลต EJS ของคุณ คุณจะต้องผ่านสิ่งนั้นไป res.render('wallpaper-page',{fres: fres[0]});

ตอนนี้คุณสามารถเข้าถึงคีย์ description ได้โดยตรง แต่ฉันไม่เข้าใจว่า fres._id ทำงานอย่างไร ก็ควรเป็น undefined ด้วย

person Som Shekhar Mukherjee    schedule 04.04.2021
comment
โอ้ขอโทษ! ฉันทำผิดโง่ๆ น่าจะเป็น {fres: fres[0]} @lolman ลองนี่สิ - person Som Shekhar Mukherjee; 04.04.2021
comment
ฉันสร้างตัวแปรอื่นโดยมีค่าเป็น fres[0] และส่งต่อไปยังมุมมอง ฉันยังไม่ได้กำหนดและ ._id แก้ไขได้: ตกลง แก้ไข 2: ปัญหายังคงมีอยู่ :( - person MasterMind; 04.04.2021
comment
นี่เป็นปัญหาหรือเปล่า <pre><%= fres.description%> %> </pre> คุณกำลังปิดมันสองครั้ง - person Som Shekhar Mukherjee; 04.04.2021
comment
ใช่เห็นสิ่งนั้นก่อนหน้านี้ แก้ไขสิ่งนั้นแล้ว - person MasterMind; 04.04.2021
comment
คุณเข้าสู่ระบบที่ไหนกันแน่ fres? บันทึกหลังจากวิธี filter - person Som Shekhar Mukherjee; 04.04.2021