Как я могу получить доступ к свойствам результата запроса к базе данных populated() в ejs?

Я пытаюсь получить доступ и отобразить результаты заполненного запроса к базе данных во внешнем интерфейсе, но я получаю неопределенное значение, когда пытаюсь получить доступ к свойствам заполненной переменной. Итак, ниже приведены схемы, на которые ссылается мой метод поиска мангуста.

Схема котировок

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>
<% } %>

person jrantz    schedule 08.11.2017    source источник


Ответы (1)


Вероятно, есть ошибка в том, как вы вставляете экземпляры:

let quote = new Quote({
   author: req.body.author,
   quote: req.body.quote,
   {$push:{submittedBy: req.body.userId}}
});

Попробуйте использовать это. Возможно, это сработает, если это не дает снимок объекта, который вы получаете после заполнения результата перед рендерингом.

вы получите массив из submitBy, поэтому вы не можете напрямую получить доступ к имени пользователя, потому что в схеме вы указали тип массива.

вместо квадратных скобок используйте фигурные скобки.

вы можете сделать так:

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
 } //removed square brackets
 }, {
timestamps: true
})

const Quote = mongoose.model('quotes', QuoteSchema)
module.exports = Quote

Теперь следуйте той же процедуре, которой вы следовали, игнорируйте первую процедуру в ответе, если у вас есть только один пользователь, отправляющий цитату. Если несколько пользователей могут, тогда submitBy будет массивом и соответственно получит к нему доступ.

person Akshit Grover    schedule 09.11.2017