Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Next.js API在出现错误或没有HTTP方法匹配时路由默认响应_Javascript_Node.js_Express_Next.js - Fatal编程技术网

Javascript Next.js API在出现错误或没有HTTP方法匹配时路由默认响应

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

我在Next.js中工作,每个路径的结构如下:

从“下一步”导入{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
。谢谢!