#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();