我使用 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 块,但仍然可以很好地构建并在生产中运行?
更新:
虽然我还没有找到上述解决方案的答案,但我已经消除了路线段根部的 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};
}
有点重复,但后端的响应对错误仍然是不透明的,前端也很容易处理响应的处理方式。