При отправке данных mongoose в файл ejs данные передаются как [object, object]

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #mongoose

Вопрос:

Я пытаюсь получить имя пользователя, с которым пользователь зарегистрировался / вошел в систему, из базы данных mongo, затем отправить его в основной файл панели мониторинга, однако, когда я регистрируюсь, место имени пользователя, где оно должно отображаться, просто [Object, Object] . Я думаю, это потому, что я не проанализировал данные (что я не знаю, как это сделать), поскольку местом имени пользователя должен быть [ { _id: 5fb119fb320e384c14ee995f, username: '1' } ] мой код (App.Js )

 var test = User.find().select({ email: req.body.email }); // Selects the username from the email that has been inputted
res.render("dashboard", {year:year, username: test}) // Renders the file
  

Комментарии:

1. Я полагаю, вы хотите выполнить запрос как const user = await User.findOne({ email: req.body.email }).exec(); res.render("dashboard", {year: year, username: user.username })

2. @chridam когда я попробовал это, он пришел с синтаксической ошибкой. Ошибка синтаксиса: ожидание допустимо только в асинхронной функции

3. Вы не показали нам функцию промежуточного программного обеспечения express, из которой вы вызываете эти методы. Вам нужно обернуть это в асинхронную функцию, например app.get('/username', async function (req, res) { const user = await User.findOne({ email: req.body.email }).exec(); res.render("dashboard", {year: year, username: user.username }); } );

Ответ №1:

Как сказал @chridam, вы не await выполняете вызов своей базы данных, поэтому все, что вы получаете, это неразрешенное обещание.

Вам нужно добавить await , что, как вы заметили, требует нахождения внутри async функции.

Следующий момент, это не то, как вы запрашиваете Mongo. .find() будут выбраны все документы в вашей базе данных. И это не то, как вы используете .select() . Он используется для выбора только некоторых полей в каждом документе, например .find().select("userName email") , и вы передаете ему строку, а не объект. Прочитайте документ!

Но даже тогда вы будете получать не JSON-данные, а объекты Mongoose .

Объекты Mongoose — это не просто простые данные. У них также есть такие методы, как .save() .

Если вам нужны только данные без методов, используйте .lean() (и, кроме того, это быстрее, потому что он не создает объекты Mongoose :

 const callDb = async () => {
    const test = await User.find({ email: req.body.email }).lean();
    res.render("dashboard", {year:year, username: test})
}

callDb();