代码之家  ›  专栏  ›  技术社区  ›  iagowp

Next.js混淆API响应

  •  0
  • iagowp  · 技术社区  · 4 年前

    我正试图用Next.js开发我的第一个应用程序,但发生了一些让我很困扰的事情。

    我的应用程序在首次加载后发出2个请求, /api/me /api/feed

    我的组件获取数据如下:

    useEffect(() => {
      async function loadData() {
        const res = await fetch('/api/me');
        try {
          const body = await res.json();
          if (body.error) {
            return router.push('/login');
          }
          setUser(body.user);
        } catch (e) {
          router.push('/login');
        }
      }
      loadData();
    }, []);
    
    useEffect(() => {
      async function loadFeed() {
        const res = await fetch('/api/feed');
        const body = await res.json();
        console.log('fetch', body.data);
        setFeed(body.data);
      }
    
      if (user) {
        loadFeed();
      }
    }, [user]);
    

    我的问题是,有时当它重新加载时,响应会混淆。 /feed 返回一个数组 /me 一个物体。重新加载时,有时两者都有 /饲料 /我 从接收对象 /我 ,有时它们都从 /饲料 ,有时它工作正常。我没有发现有人报告这样的错误,所以我假设这是我的一个错误。

    /pages/feed/api.js

    import handler from '../../helpers/routes/handler';
    import auth from '../../middlewares/auth';
    import * as feedController from '../../controllers/feed';
    
    export default handler
      .use(auth)
      .get((req, res) => feedController.get(req, res));
    

    handler.js

    import nextConnect from 'next-connect';
    import { getSession } from '../../config/passport/encrypt';
    
    const handler = nextConnect()
      .use(async (req, res, next) => {
        const session = await getSession(req);
    
        if (!session) {
          return next();
        }
        ...
        next();
      });
    
    export default handler;
    

    controllers/feed.js

    import * as expertMarketerService from '../services/expert_marketer';
    
    // eslint-disable-next-line import/prefer-default-export
    export const get = async (req, res) => {
      const data = await expertMarketerService.get(req.user);
      return res.status(200).send({ data });
    };
    

    pages/api/me.js

    import handler from '../../helpers/routes/handler';
    import auth from '../../middlewares/auth';
    
    export default handler
      .use(auth)
      .get((req, res) => res.status(200).send({ user: req.user }));
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   Shansana Waruna    3 年前

    我找到了解决办法。有同样的问题。我所做的是创建并导出模块,而不是直接导出。这是我的密码

    import nc from 'next-connect';
    import someCommonMiddleware from '..some-common-middlware-path';
    
    module globalHandler {
        const config = {
            onError : (error, req, res) => {
                // handle errors
            }
        };
        export function handle() {
            return nc(config)
            .use(someCommonMiddleware);
        }
    }
    
    export default globalHandler;
    

    然后你可以这样使用它

    import { NextApiRequest, NextApiResponse } from 'next';
    import globalHandler  from '..your-global-handler-path';
    
    const handler = globalHandler.handle()
        .get(async (req: NextApiRequest, res: NextApiResponse) => {
            // handle url api response here
        });
    
    export default handler;
    
        2
  •  0
  •   iagowp    3 年前

    我发现了问题。我对不同的路由使用了相同的next connect实例,这是不可能的。

    https://github.com/hoangvvo/next-connect/issues/106

    解决方案是为每个页面导入下一个连接,并为该共享逻辑使用中间件