遍历哈巴狗中的javascript对象

时间:2018-09-23 20:29:47

标签: javascript node.js loops express pug

我已经看过其中一些问题,但答案似乎从未明确。我需要在哈巴狗视图中遍历一个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 :(得分:2)

您的问题在渲染功能中,只需进行一些小更改即可轻松解决。

代替此:

$('form.myform').submit(function (event) {

    event.preventDefault();

    var form = $(this);
    var token = ''; // how do I get the token?
    submitForm(form, token); // token is not defined here but I want it to be

});

您应该这样做:

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

console.log(words); res.render('result', {"words": words}); 没有a specified return type,因此您只应将其用作日志编写器,而不要依赖它返回任何内容。将日志条目保留在单独的行中。

请注意,单词集合是如何包含在以“单词”为键的对象中的。这样可以正确设置它,以便pug模板使用变量名console.log来引用它。

您在模板中设置的每个循环看起来都不错,并且在进行了上述更改后应该可以正常工作。

要更进一步,假设您还想在模板中添加“每日一词”。渲染功能如下所示:

words

您的模板将如下所示:

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