正在 Node.js 中加载来自 api 的更多内容
Loading more content from api in Node.js
所以我刚开始学习 Node.js 并且我正在尝试弄清楚如何在单击按钮时加载更多内容。我想我要么误会了什么,要么我自己感到困惑。
目前代码可能有点乱,因为我已经尝试了很多不同的东西。
至此我有一个首页路由:
//Home
app.get('/', (req, res)=> {
res.render('homepage');
});
在主页上,我有一个使用 get 调用 /search 路由的搜索栏:
<form action="/search" method="get" id="form">
<input class="search" name="searchQuery"/>
<button type="submit">Submit</button>
</form>
然后调用 API 的搜索路由,解析 XML,呈现搜索页面,并发送一些数据:
//Search
app.get('/search', async (req, res) => {
g_searchQuery = req.query.searchQuery;
const fetch_response = async (url, query) => {
try {
const response = await fetch(url);
const xml = await response.text();
xml2js.parseString(xml, (error, result) => {
var paginations = result.GoodreadsResponse.search[0];
totalResults = parseInt(paginations['total-results']);
resultsEnd = parseInt(paginations['results-end']);
g_resultsEnd = resultsEnd;
var test = result.GoodreadsResponse.search[0].results[0].work.map( w => {
let bestBook = w.best_book[0];
return {
title: bestBook.title[0],
author: bestBook.author[0].name,
image_url: bestBook.image_url[0],
small_image: bestBook.small_image_url[0],
original_publication_year: w.original_publication_year[0]._,
}
});
res.render('search', {data : {
goodReadsResponse : test,
searchQuery : query,
totalResults : totalResults,
resultsEnd : g_resultsEnd,
currentPage : g_currentPage
}});
res.end();
});
}
};
fetch_response(goodreadsapi + '?key=' + goodreadskey + '&q=' + g_searchQuery + '&page=' + g_currentPage, g_searchQuery);
});
搜索页面呈现数据并有一个加载更多按钮,使用 Fetch api 调用 /search POST:
<body>
<h1>You searched for: <%= data.searchQuery %></h1>
<% if(data.goodReadsResponse) { %>
<ul class="data-container">
<%= data.totalResults %>
<%= data.currentPage %>
<% data.goodReadsResponse.forEach(function(book) { %>
<li>
<span><%= book.title %></span>
<span><%= book.author %></span>
<span><img src="<%= book.image_url %>"/></span>
<span><img src="<%= book.small_image %>"/></span>
<span><%= book.original_publication_year %></span>
</li>
<% }); %>
</ul>
<% if(data.resultsEnd <= data.totalResults) { %>
<div class="load-more__container">
<button class="load-more__button" type="button">Load More</button>
</div>
<% } %>
<% } %>
</body>
<script type="text/javascript">
window.addEventListener('load', function() {
const loadMore = document.querySelector('.load-more__button');
if(loadMore) {
loadMore.addEventListener('click', (event) => {
event.preventDefault('Load More');
fetch('/search', {
method : 'POST'
})
});
}
});
</script>
然后这是我卡住和困惑的部分。我有一个用于加载更多按钮的 app.post /search 路由,但我不确定将数据传递给 route/if 的最佳方式是什么,我什至需要这样做。
我的想法是,我需要将我在/search app.get 路由中通过render 传递的大部分数据传递给app.post /search 路由向当前页面添加1,然后追加我从 API 获得的数据到以前的数据,然后使用更新后的数据呈现页面。但是我有点卡住了。
这是我的回购协议,它不是 1:1 因为我试图清理一些问题的东西。
如有任何帮助,我们将不胜感激,
谢谢。
让bestBook = w.best_book[0];
在上面的行中,考虑到 w.best_book 是一个书籍列表,你可以循环它并将所有书籍保存在一个单独的变量中,然后渲染它当按下 加载更多 按钮时。
所以我刚开始学习 Node.js 并且我正在尝试弄清楚如何在单击按钮时加载更多内容。我想我要么误会了什么,要么我自己感到困惑。
目前代码可能有点乱,因为我已经尝试了很多不同的东西。
至此我有一个首页路由:
//Home
app.get('/', (req, res)=> {
res.render('homepage');
});
在主页上,我有一个使用 get 调用 /search 路由的搜索栏:
<form action="/search" method="get" id="form">
<input class="search" name="searchQuery"/>
<button type="submit">Submit</button>
</form>
然后调用 API 的搜索路由,解析 XML,呈现搜索页面,并发送一些数据:
//Search
app.get('/search', async (req, res) => {
g_searchQuery = req.query.searchQuery;
const fetch_response = async (url, query) => {
try {
const response = await fetch(url);
const xml = await response.text();
xml2js.parseString(xml, (error, result) => {
var paginations = result.GoodreadsResponse.search[0];
totalResults = parseInt(paginations['total-results']);
resultsEnd = parseInt(paginations['results-end']);
g_resultsEnd = resultsEnd;
var test = result.GoodreadsResponse.search[0].results[0].work.map( w => {
let bestBook = w.best_book[0];
return {
title: bestBook.title[0],
author: bestBook.author[0].name,
image_url: bestBook.image_url[0],
small_image: bestBook.small_image_url[0],
original_publication_year: w.original_publication_year[0]._,
}
});
res.render('search', {data : {
goodReadsResponse : test,
searchQuery : query,
totalResults : totalResults,
resultsEnd : g_resultsEnd,
currentPage : g_currentPage
}});
res.end();
});
}
};
fetch_response(goodreadsapi + '?key=' + goodreadskey + '&q=' + g_searchQuery + '&page=' + g_currentPage, g_searchQuery);
});
搜索页面呈现数据并有一个加载更多按钮,使用 Fetch api 调用 /search POST:
<body>
<h1>You searched for: <%= data.searchQuery %></h1>
<% if(data.goodReadsResponse) { %>
<ul class="data-container">
<%= data.totalResults %>
<%= data.currentPage %>
<% data.goodReadsResponse.forEach(function(book) { %>
<li>
<span><%= book.title %></span>
<span><%= book.author %></span>
<span><img src="<%= book.image_url %>"/></span>
<span><img src="<%= book.small_image %>"/></span>
<span><%= book.original_publication_year %></span>
</li>
<% }); %>
</ul>
<% if(data.resultsEnd <= data.totalResults) { %>
<div class="load-more__container">
<button class="load-more__button" type="button">Load More</button>
</div>
<% } %>
<% } %>
</body>
<script type="text/javascript">
window.addEventListener('load', function() {
const loadMore = document.querySelector('.load-more__button');
if(loadMore) {
loadMore.addEventListener('click', (event) => {
event.preventDefault('Load More');
fetch('/search', {
method : 'POST'
})
});
}
});
</script>
然后这是我卡住和困惑的部分。我有一个用于加载更多按钮的 app.post /search 路由,但我不确定将数据传递给 route/if 的最佳方式是什么,我什至需要这样做。
我的想法是,我需要将我在/search app.get 路由中通过render 传递的大部分数据传递给app.post /search 路由向当前页面添加1,然后追加我从 API 获得的数据到以前的数据,然后使用更新后的数据呈现页面。但是我有点卡住了。
这是我的回购协议,它不是 1:1 因为我试图清理一些问题的东西。
如有任何帮助,我们将不胜感激, 谢谢。
让bestBook = w.best_book[0];
在上面的行中,考虑到 w.best_book 是一个书籍列表,你可以循环它并将所有书籍保存在一个单独的变量中,然后渲染它当按下 加载更多 按钮时。