【问题标题】:res.send() not sending back complete data setres.send() 没有发回完整的数据集
【发布时间】:2020-12-25 15:44:19
【问题描述】:

希望大家能帮我解开这个谜。我为我的 API 创建了一个端点:

apiRouter.get("/username", async (req, res) => {
  const { username } = req.body;
  try {
    const user = await getUserByUsername(username);

    res.send({ message: "This is your user", user });
    console.log("this is user", user);
  } catch (error) {
    throw error;
  }
});

这是一个 GET 路由,当用户与此 url 路径交互时,应该以这种方式发回消息和用​​户对象:

 http://localhost:3000/api/users/username 

当我通过 Postman 访问端点时,我会同时取回消息和用​​户对象。看起来像这样的东西:

{
    "message": "This is your user",
    "user": {
        "customer_id": 5,
        "first_name": "Jessica",
        "last_name": "Blue",
        "email": "baker@space.com",
        "username": "jess1",
        "password": "1234",
        "address_1": "123 pretty lane",
        "address_2": "Apt 31",
        "city": "Riverside",
        "state": "California"
    }
}

但是,当我通过前端访问路由时,消息会返回,但用户不会返回。我正在使用以下方法调用服务器:

export async function getUserByUsername(username) {
  try {
    const { data } = await axios.get("/api/users/username", {
      username,
    });
    console.log(data);
    return data;
  } catch (error) {
    throw error;
  }
}

我真的不确定为什么用户没有收到回复。该路线有效,我只是没有得到预期的回应。我花了几个小时试图找到一个没有运气的修复方法。任何帮助将不胜感激。enter image description here

【问题讨论】:

  • 试试res.send( { message: "This is your user", user: { ...user } } );
  • postman 和 chrome devtool 都可以将您的请求转换为 curl 命令。你可以比较一下,看看到底有什么不同。
  • req.body更改为req.query
  • 您要发送带有 GET 的正文吗?我很确定您的 axios 请求必须是 POST。
  • 这能回答你的问题吗? body data not sent in axios request

标签: javascript express axios


【解决方案1】:

目前,您无法在大多数浏览器中发送带有 get 请求的正文。所以你有两个选择:

将您的后端方法更改为 POST:

apiRouter.post("/username", async (req, res) => {
  const { username } = req.body;
  .
  .
  .
}

并像这样使用 axios:

const { data } = await axios.post("/api/users/username", {
  username,
});

或者如果您想坚持使用 get 方法,请接受用户名作为查询或参数:

apiRouter.get("/username/:username", async (req, res) => {
  const { username } = req.params;
  .
  .
  .
}

并像这样使用 axios:

const { data } = await axios.get(`/api/users/username/${username}`);
    

apiRouter.get("/username", async (req, res) => {
  const { username } = req.query;
  .
  .
  .
}

并像这样使用 axios:

const { data } = await axios.get(`/api/users/username`, { params: { username } });

【讨论】:

    【解决方案2】:

    您正在使用带有bodyGET 请求。虽然这是可能的,但not advisable,当您通过Postman 创建自己的请求时,axios 可能会在使用GET 请求时忽略body 参数并且不将其包含在请求中。

    所以我的建议是将 username 参数放在请求参数 (req.params) 或请求查询 (req.query) 中并尝试从那里获取。

    您可以找到更多关于req.params:here和关于req.query:here的详细信息。

    【讨论】:

    • 它不会在req.params
    【解决方案3】:

    我认为这可能是因为您在 endPoint 中使用的异步等待方法本身,您可以尝试在终端中运行此行: npm install express-async-errors --save 之后转到 index.js(您的后端路由文件)并在此处添加此行: import 'express-async-errors'; 然后再试一次,希望这能解决您的问题

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 2010-09-06
      • 2016-04-30
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多