在 NextJs(应用程序路由器)中获取 api 路由,以便在抛出错误时使用 JSON {ok:false} 进行响应

问题描述 投票:0回答:1

我使用 fetch() API 路由用数据填充我的仪表板页面。在开发过程中,我采取的计划是使用 try {} catch {} 块来处理和捕获错误,然后将错误消息传递到本地日志文件。然后服务器会以 {ok:false} 响应,这是表示“不好”的通用方式。这和其他条件一模一样,比如没有登录,这使得生产服务器非常不透明。

这是一个例子:

import { logError } from 'errorLogger';
import { getEncryptedSessionCookie, smartSessionSave } from 'authHandler';

export async function GET(req) {
    try {
        const session = await getEncryptedSessionCookie();
        // Perform a series of tasks.
        await smartSessionSave(session);
        return Response.json(ret);
    } catch (err) {
        logError('/api/happyLittleRoute',err);
        return Response.json({ok:false});
    }

无论如何,现在我正在生产中测试 Next 服务器,我发现当我构建应用程序时,我收到如下错误:

/api/happyLittleRoute   Error: Dynamic server usage: Page couldn't be rendered statically because it used `cookies`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error

我已经能够通过消除 try/catch 块来消除错误,这表明这是罪魁祸首。但是,结果是,我没有像使用 logError() 函数那样将错误记录到文件中。另外,如果没有 try/catch 块,服务器最终会返回服务器错误,这无法满足我对服务器在外界看来运行良好的要求。

我在 nextjs.org 上搜索了有关如何创建错误处理程序的信息,但文档仅描述了如何创建一些内容来在渲染页面时处理错误。

https://nextjs.org/docs/app/api-reference/file-conventions/error

是否有一种正确的方法来为所有 GET() 和 POST() 导出函数创建错误边界,使其行为类似于上面显示的 catch 块,但仍然可以很好地构建并在生产中运行?

next.js error-handling try-catch nextjs-api-router
1个回答
0
投票

更新:

虽然我还没有找到上述解决方案的答案,但我已经消除了路线段根部的 try 块,并将未处理的错误视为设计缺陷。

我采取的一种常见做法是从我编写的库函数返回对象,其中对象 ok 表示状态,数据表示返回。

myDatabaseCall.js

export async function getUserList(authObj) {
  try {
    // do all the database stuff here
    return {ok: true, data: arrayOfThings}
  } catch (err) {
    // handle custom logging for production.
    return {ok:false}
  }
}

route.js

import getUserList from './myDatabaseCall.js';
import performAuthCheck from './myAuthCheck.js'; //not shown


export async function GET(req) {
  let auth = await performAuthCheck(req,'administrator');
  if (auth.ok === false) {
    return {ok:false}
  }
  let userList = getUserList(auth.data);
  if (userList.ok === false) {
    return {ok:false}
  }
  return {ok:true, data:userList.data};
}

有点重复,但后端的响应对错误仍然是不透明的,前端也很容易处理响应的处理方式。

© www.soinside.com 2019 - 2024. All rights reserved.