Я пытаюсь получить доступ и отобразить результаты заполненного запроса к базе данных во внешнем интерфейсе, но я получаю неопределенное значение, когда пытаюсь получить доступ к свойствам заполненной переменной. Итак, ниже приведены схемы, на которые ссылается мой метод поиска мангуста.
Схема котировок
const express = require('express')
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const User = require('../models/users')
let QuoteSchema = new Schema({
author: {
type: String,
trim: true
},
quote: {
type: String,
unique: [true, "this quote already exists."],
trim: true
},
submittedBy: [{
type: Schema.Types.ObjectId,
ref: 'users'
// trim: true,
// required: true
}]
}, {
timestamps: true
})
const Quote = mongoose.model('quotes', QuoteSchema)
module.exports = Quote
Схема пользователя
const express = require('express')
const mongoose = require('mongoose')
const Schema = mongoose.Schema
let UserSchema = new Schema ({
username: {
type: String,
unique: [true, "This username is taken."],
trim: true,
},
email: {
type: String,
unique: [true, "This email is already being used."],
trim: true
},
password: {
type: String,
trim: true
},
favorites: []
}, {
timestamps: true,
})
const User = mongoose.model('users', UserSchema)
module.exports = User
Вот запрос мангуста. Метод заполнения добавляется к методу поиска, а метод сортировки добавляется к методу заполнения. Тип результатов подтверждает, что это объект, но я не думаю, что он останется таким, когда попадет в ejs.
Запрос к базе данных и отправка запроса в файл маршрута
router.get('/', (req, res, next) => {
console.log("beginning query...")
const flashMessages = res.locals.getMessages()
if (req.user) {
Quote.find({}).populate('submittedBy').sort({ _id: -1 })
.exec((err, results) => {
console.log(typeof results) // returns "object"
err ? console.log(err) : res.render('index', { quotes: results, user: req.user, csrfToken: req.csrfToken() });
})
}
})
router.post('/quotes', (req, res, next) => {
if(req.isAuthenticated()) {
let quote = new Quote({
author: req.body.author,
quote: req.body.quote,
submittedBy: req.body.userId
})
quote.save((err, quote) => {
if (err) {
console.log(err)
} else {
console.log("Added the quote \"" + quote.quote + "\" by " + quote.author + ".")
res.redirect('/')
}
})
.catch(next)
} else {
req.flash("restricted", "You must first login before you can add quotes to the community feed.")
res.redirect('/')
}
})
Вот я и думаю, что ошибка. В самом последнем теге span кавычки [i].submittedBy возвращает всю переменную «submittedBy», что означает, что метод заполнения сделал то, что предполагалось. Но если я попытаюсь получить доступ к свойству этого объекта, он вернет неопределенное значение. quotes[i].submittedBy.username возвращает неопределенное значение. Когда я проверяю элемент, submitBy заключен в кавычки, поэтому я думаю, что теперь это строка по какой-то причине. Но если я попытаюсь использовать JSON.parse() или JSON.stringify(), я получу ошибку в обоих случаях. Я не уверен что делать. Пожалуйста помоги!
Визуализация EJS
<% for(var i = 0; i < quotes.length; i++) {%>
<li class="quote">
<i class="fa fa-close fa-quote-close move hidden"></i>
<i class="fa fa-heart hidden"></i>
<span class="make-bold nhauthorValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].author %></span> once said: "<span class="quoteValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].quote %></span>"
<span class="by"><%= quotes[i].submittedBy.username %></span>
</li>
<% } %>