Javascript Next.js API在出现错误或没有HTTP方法匹配时路由默认响应
我在Next.js中工作,每个路径的结构如下:Javascript Next.js API在出现错误或没有HTTP方法匹配时路由默认响应,javascript,node.js,express,next.js,Javascript,Node.js,Express,Next.js,我在Next.js中工作,每个路径的结构如下: 从“下一步”导入{NextApiRequest,nextapireresponse}; 导出默认异步(请求:NextApiRequest,res:nextapireresponse)=>{ const{query}=req; 试一试{ 开关(请求方法){ 案例“GET”: //做点什么 资源状态(200)。发送(结果); 打破 案例“职位”: //做一些帖子 资源状态(200)。发送(结果); 打破 违约: //无匹配方法 res.status(4
从“下一步”导入{NextApiRequest,nextapireresponse};
导出默认异步(请求:NextApiRequest,res:nextapireresponse)=>{
const{query}=req;
试一试{
开关(请求方法){
案例“GET”:
//做点什么
资源状态(200)。发送(结果);
打破
案例“职位”:
//做一些帖子
资源状态(200)。发送(结果);
打破
违约:
//无匹配方法
res.status(405).send(“不允许使用方法”);
打破
}
}捕获(e){
//不可加工实体
资源状态(422)。发送(e);
}
};
如您所见,默认
案例和捕获
部分将复制到所有文件中。所以,我想知道:
- 当没有匹配的方法或处理请求时出错时,Next.js是否有内置的支持默认响应
- (如果没有内置支持)如何实现
如果没有内置支持,下面是我的解决方案:
- 使用中间件
- 在导出默认值之前创建一个函数来包装API调用。我试图实现这一点,但仍停留在访问
和req
对象上,如下面的代码块所示res
const wrapicall=async(
fn:(请求:NextApiRequest,res:nextapireresponse)=>void
) => {
试一试{
等待fn(req,res);//无法在此处访问req,res
}捕获(e){
res.status(422).send(e);//也无法在此处访问req,res
}最后{
如果(!res.headerssend)res.status(405).send(“不允许使用方法”);
}
};
const apiCall=async(请求:NextApiRequest,res:nextapireresponse)=>{
//做一些API的东西
};
导出默认调用(apiCall);
我认为您的包装解决方案是合理的。要使它工作,您只需要从包装器返回一个函数
常量调用=(
fn:(请求:NextApiRequest,res:nextapireresponse)=>void
) => {
返回异步(请求:NextApiRequest,res:nextapireresponse)=>{
试一试{
等待fn(请求、回复);
}捕获(e){
资源状态(422)。发送(e);
}最后{
如果(!res.headerssend)res.status(405).send(“不允许使用方法”);
}
}
};
我找到了另一种解决方案,而不是编写自定义包装器,它是Next.js的路由中间件
下面的代码产生与包装器解决方案相同的结果
import { NextApiRequest, NextApiResponse } from "next";
import nc from "next-connect";
// Handle Error Here
const handler = nc({
onError: (err, req: NextApiRequest, res: NextApiResponse) => {
res.status(500).end(err.toString());
},
onNoMatch: (req: NextApiRequest, res: NextApiResponse) => {
res.status(405).send("Method Not Allowed");
},
});
handler
.get(async (req: NextApiRequest, res: NextApiResponse) => {
// Do some GET stuff
res.status(200).json(...);
})
.post(async (req: NextApiRequest, res: NextApiResponse) => {
// Do some POST stuff
res.status(200).json(...);
});
export default handler;
如果您想让处理程序可重用,可以将单独的API路由到多个文件中
/modules/Utils.ts
export const apiHandler = {
onError: (err, req: NextApiRequest, res: NextApiResponse) => {
res.status(500).end(err.toString());
},
onNoMatch: (req: NextApiRequest, res: NextApiResponse) => {
res.status(405).send("Method Not Allowed");
},
};
import nc from "next-connect";
import { apiHandler } from "../modules/Utils";
const handler = nc(apiHandler); // Use handler exported from Utils
handler
.get((req, res) => {...})
.post((req, res) => {...});
export default handler;
/pages/api/index.ts
export const apiHandler = {
onError: (err, req: NextApiRequest, res: NextApiResponse) => {
res.status(500).end(err.toString());
},
onNoMatch: (req: NextApiRequest, res: NextApiResponse) => {
res.status(405).send("Method Not Allowed");
},
};
import nc from "next-connect";
import { apiHandler } from "../modules/Utils";
const handler = nc(apiHandler); // Use handler exported from Utils
handler
.get((req, res) => {...})
.post((req, res) => {...});
export default handler;
我完全忘记了
return
。谢谢!