Node.js 从React本机应用程序在Nodejs(ORM Sequelize)中分页
对不起,如果我的标题不是描述性的。我有一个react原生应用程序和nodejs后端,sequelize作为我的ORM 最初一切正常,我从后端获取所有帖子,并在前端查看它们。我也有一个搜索栏供用户搜索任何帖子的标题,帖子就会出现 经过几天的研究和提问,我被告知将所有帖子放在一起查看不是最好的做法,因为这意味着所有帖子都将加载给用户,如果用户不向下滚动,那将是一种浪费 有人建议我应该在后端实现分页和过滤标题,然后在前端使用它们。因为帖子将被分成页面,用户需要滚动来加载下一组帖子等等。对于过滤器,它将过滤整个数据库,并查看标题中包含搜索词或短语的帖子 在过去的几天里,我一直在尝试这样做,但它根本不起作用 当我向下滚动时,下一页不会呈现,我的后端出现以下错误:Node.js 从React本机应用程序在Nodejs(ORM Sequelize)中分页,node.js,react-native,sequelize.js,Node.js,React Native,Sequelize.js,对不起,如果我的标题不是描述性的。我有一个react原生应用程序和nodejs后端,sequelize作为我的ORM 最初一切正常,我从后端获取所有帖子,并在前端查看它们。我也有一个搜索栏供用户搜索任何帖子的标题,帖子就会出现 经过几天的研究和提问,我被告知将所有帖子放在一起查看不是最好的做法,因为这意味着所有帖子都将加载给用户,如果用户不向下滚动,那将是一种浪费 有人建议我应该在后端实现分页和过滤标题,然后在前端使用它们。因为帖子将被分成页面,用户需要滚动来加载下一组帖子等等。对于过滤器,它将
(node:22371) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: column "nan" does not
exist
当我在后端加载应用程序时,console.log(page)打印0,这是正确的,但当我向下滚动查看下一页时,console.log(page)打印未定义,然后抛出上面的错误
以下是我的后端代码:
router.get("/",
async (req, res) => {
let filter = {};
let { q } = req.query;
if (q) {
filter = {
where: {
title: {
[Op.like]: `${q}%`,
},
},
};
}
const getPagination = (page) => {
const limit = 10;
const offset = page ? page * limit : 0;
return { limit, offset };
};
const { page } = req.query;
const { limit, offset } = getPagination(page);
console.log(page)
const posts = await Post.findAll({
limit,offset,
filter,
order: [["createdAt", "DESC"]],
以下是我的本机代码:
const getPosts = (page) => client.get(`/posts?page=${page}`);
我的定制挂钩:
export default useApi = (apiFunc) => {
const [data, setData] = useState([]);
const [error, setError] = useState(false);
const [loading, setLoading] = useState(false);
const request = async (...args) => {
setLoading(true);
const response = await apiFunc(...args);
setLoading(false);
setError(!response.ok);
setData(response.data);
return response;
};
return { request, data, error, loading };
};
我的帖子屏幕:
const { data: posts, error, loading, request: loadPosts } = useApi(getPosts);
const[page,setPage]=useState(0);
useEffect(() => {
loadPosts(page);
}, [page]);
const handleLoadMore = ()=>{
setPage(page+1);
}
let posts = posts.filter((post) => {
return post.title.toLowerCase().includes(search.toLowerCase());
});
const updateSearch = (e) => {
setSearch(e);
};
return(
<TextInput onChangeText={updateSearch}/>
// this is how i was implementing the search in frontend but now i want implement from
backend//
<FlatList
data={posts} // to have all the data
keyExtractor={(post) => post.id.toString()}
renderItem={({ item }) => (
<Card
title={item.title}
subTitle={item.subtitle}
onPress={() => navigation.navigate(routes.PostDetails, item)}
/>
)}
bounces={false}
onEndReached={handleLoadMore}
onEndReachedThreshold={0.001}
/>
)
Sequelize中没有“filter”选项,请使用“where”。wait Post.findAndCountAll({limit,offset,…filter,…})@Mr.我自己创建了filter函数并添加了它,你会在findAll上面找到它
initialNumToRender={10}
onMomentumScrollBegin = {() =>
{onEndReachedCalledDuringMomentum}}
onEndReached = {() => {
if (!onEndReachedCalledDuringMomentum) {
loadPosts(page+1) // LOAD MORE DATA
setonEndReachedCalledDuringMomentum(true);
}
}
}