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