Перебрать объект javascript в мопсе - PullRequest
0 голосов
/ 23 сентября 2018

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

Контроллер:

app.get('/search/:keyword', (req, res) => {
        scraper
        .searchDictionary(req.params.keyword)
        .then(words => {
        res.render('result', console.log(words))
    });
})

Вот фактическая функция, которая делает объект:

function searchDictionary(searchTerm){
    const url = `https://www.dictionary.com/browse/${searchTerm}?s=t`
    return fetch(`${url}${searchTerm}`)
        .then(response => response.text())
        .then(body => {
        const words = []
        const $ = cheerio.load(body);
        $('ol').each(function(i, element){
            const $element = $(element)
            const $definition = $(element).find('li')
            const word = {
                keyword: searchTerm,
                definition: $definition.text(),
                speechParts: $('span.luna-pos').text(),
                tenses: $('span.luna-inflected-form').text()
            }
            words.push(word);
        });
        return words
    });
}

Сейчасвсе, что осталось, это перебрать объект на мой взгляд.Я продолжаю получать страшные Cannot read property 'length' of undefined.Console.log показывает контроллер, отображающий правильные данные.

[{ keyword: 'cat',
    definition: 'a person, especially a man.a devotee of jazz.',
    speechParts: 'nounverb (used with object),verb (used without object),Verb PhrasesIdioms',
    tenses: 'cat·ted,cat·ting.cat·ted,cat·ting.' }]

(есть еще объекты, просто хотел показать пример)

Мой взгляд выглядит так:

body
h1
    ul
        each word in words
            li= word.keyword

1 Ответ

0 голосов
/ 24 сентября 2018

Ваши проблемы в функции рендеринга, легко решаемые с небольшими изменениями.

Вместо этого:

res.render('result', console.log(words))

Вы должны сделать это:

console.log(words);
res.render('result', {"words": words});

console.log не имеет указанного возвращаемого типа , поэтому вы должны использовать его только как средство записи журнала и не зависеть от того, что он что-либо возвращает.Сохраняйте записи журнала в своих отдельных строках.

Обратите внимание, как коллекция слов содержится в объекте с «словами» в качестве ключа.Это настроит его правильно для шаблона pug, чтобы он ссылался на него, используя имя переменной words.

Каждый цикл, который вы настроили в шаблоне, выглядит хорошо и должен работать, как только вы внесете указанные выше изменения.

Чтобы сделать еще один шаг вперед, допустим, вы также хотели добавить «слово дня» в свой шаблон.Функция рендеринга выглядела бы так:

res.render('result', {
  "words": words,
  "wordOfTheDay": "lorem"
});

Ваш шаблон мог бы выглядеть следующим образом:

h1 Word Of The Day
p= wordOfTheDay
br
h1 Word List
ul
  each word in words
    li= word.keyword
...