You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3服务端使用$fetch调用API后返回值undefined问题排查

Nuxt3中$fetch调用API返回undefined的问题解决

问题场景

在Nuxt3里用服务端$fetch配合Prisma写入数据库,期望API返回"success"字符串给组件展示,但控制台打印answer时一直显示undefined。纠结是API返回方式错误,还是应该改用useFetch?

组件代码

async pushToDatabase() {
  for (const row of this.information) {
    if (row.data.firstName != "" && row.data.lastName != "") {
      const { answer } = await $fetch("/api/addRow", {
        method: "POST",
        body: row,
      });
      console.log(answer);
    }
  }
},

API处理代码

export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  const info = body.data as IAttendeeData;
  console.log(body);
  await prisma.test
    .create({
      data: {
        firstName: info.firstName,
        lastName: info.lastName,
        age: info.age,
        gender: info.gender,
      },
    })
    .then(() => {
      console.log("write worked");
      return "success";
    })
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    .catch((err) => {
      console.log(err.message);
      console.log("failed write");
    });
});

问题原因及解决办法

1. API未正确返回响应值

你的API函数中,await prisma.test.create(...)的.then()里返回的"success"并没有被作为API的最终响应返回。因为整个defineEventHandler函数没有返回任何内容,所以API默认返回undefined,而且混用await和.then()也容易造成逻辑混乱。

修复后的API代码:

export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  const info = body.data as IAttendeeData;
  console.log(body);
  
  try {
    await prisma.test.create({
      data: {
        firstName: info.firstName,
        lastName: info.lastName,
        age: info.age,
        gender: info.gender,
      },
    });
    console.log("write worked");
    return "success"; // 该返回值会作为API响应内容返回给前端
  } catch (err) {
    console.log(err.message);
    console.log("failed write");
    return "failed"; // 也可以返回错误信息供前端处理
  }
});

2. 前端解构方式错误

你前端使用const { answer } = await $fetch(...)进行解构,但API返回的是纯字符串"success",并非包含answer字段的对象,所以解构出来的answer自然是undefined。

修复后的组件代码:

async pushToDatabase() {
  for (const row of this.information) {
    if (row.data.firstName != "" && row.data.lastName != "") {
      const answer = await $fetch("/api/addRow", {
        method: "POST",
        body: row,
      });
      console.log(answer); // 现在会正常打印"success"或"failed"
    }
  }
},

关于是否改用useFetch

完全不需要换useFetch。useFetch主要用于组件初始化时自动获取数据,而你这里是用户触发的主动提交操作,用$fetch才是更合适的选择。


内容的提问来源于stack exchange,提问作者Maaz Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:33:09