Node.js 从React本机应用程序在Nodejs(ORM Sequelize)中分页

Node.js 从React本机应用程序在Nodejs(ORM Sequelize)中分页,node.js,react-native,sequelize.js,Node.js,React Native,Sequelize.js,对不起,如果我的标题不是描述性的。我有一个react原生应用程序和nodejs后端,sequelize作为我的ORM 最初一切正常,我从后端获取所有帖子,并在前端查看它们。我也有一个搜索栏供用户搜索任何帖子的标题,帖子就会出现 经过几天的研究和提问,我被告知将所有帖子放在一起查看不是最好的做法,因为这意味着所有帖子都将加载给用户,如果用户不向下滚动,那将是一种浪费 有人建议我应该在后端实现分页和过滤标题,然后在前端使用它们。因为帖子将被分成页面,用户需要滚动来加载下一组帖子等等。对于过滤器,它将

对不起,如果我的标题不是描述性的。我有一个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);
      }
      }
      }