为什么express服务器接收到的前端数据是未定义的?

2024-04-28

我目前正在开发社交媒体 Mern Stack React 应用程序。我使用 Node js 和 Express 作为我的后端服务,还使用 ​​mongoose 来存储我的数据,并使用 axios 和 redux thunk 将后端连接到前端。到目前为止,我在向服务器接收和发送数据时没有遇到任何问题。现在我正在尝试根据用户输入的关键字创建搜索帖子获取请求。问题在于,当我将关键字发送到服务器而不是接收字符串时,它会得到未定义的值,就像 redux thunk 不发送任何内容一样。如果有人能帮助我,我将非常感激。我一遍又一遍地查看代码,但找不到原因。

我的后控制器类(我只复制了相关函数):

import express from "express";
const app = express();
import Post from "../model/PostModel.js";
import ErrorHandlng from "../utilities/ErrorHandling.js";
import bodyParser from "body-parser";
import catchAsync from "../utilities/CatchAsync.js";
import User from "../model/UserModel.js";
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

export const getPosts = catchAsync(async (req, res, next) => {
  const data = req.body.keyword;
  const page = parseInt(req.query.page || "0");
  const PAGE_SIZE = 20;
  const query = new RegExp(data, "i");
  const total = await Post.countDocuments({});
  const posts = await Post.find({ $or: [{ title: query }, { content: query }] })
    .limit(PAGE_SIZE)
    .skip(PAGE_SIZE * page);
  if (!posts) {
    return next(new ErrorHandlng("No posts were found", 400));
  }
  res.status(200).json({
    status: "success",
    data: {
      totalPages: Math.ceil(total / PAGE_SIZE),
      posts,
    },
  });
});

我的 api 类(前端,仅复制该特定 get 请求的调用):

import axios from "axios";
const baseURL = "http://localhost:8000";
axios.defaults.withCredentials = true;
const API = axios.create({
  baseURL,
  credentials: "include",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
  },
});
export const getPostsByKeyword = (keyword, page) =>
  API.get(`/post/getPostsByKey?page=${page}`, keyword);

切片后类:

export const fetchPostsByKeyWord = createAsyncThunk(
  "post/getKeyword",
  async ({ keyword, page }, { fulfillWithValue, rejectWithValue }) => {
    try {
      const response = await api.getPostsByKeyword(keyword, page);
      if (response.statusCode === "400") {
        throw new Error("There are no available posts");
      }
      const fetchData = await response.data.data.posts;
      const totalPages = await response.data.data.totalPages;
      return fulfillWithValue({ fetchData, totalPages });
    } catch (err) {
      console.log(err.response.message);
    }
  }
);
const initialState = { status: "undefined" };
const PostSlice = createSlice({
  name: "post",
  initialState,
  reducers: {},
  extraReducers: {},
});
export const postActions = PostSlice.actions;
export default PostSlice;

调用后端:

dispatch(fetchPostsByKeyWord({ keyword, page }))
  .unwrap()
  .then((originalPromiseResults) => {
    console.log("thte " + " " + originalPromiseResults.totalPages);
    console.log("The data is" + originalPromiseResults.fetchData);
    setTotalPages(originalPromiseResults.totalPages);
  })
  .catch((err) => {
    console.log(err.message);
  });

正如您所看到的,我没有复制整个代码,我只复制了与问题相关的部分。


浏览器当前无法发送带有请求正文的 GET 请求。XMLHttpRequest(Axios 使用的)将忽略它并且fetch()会触发错误。

也可以看看带请求正文的 HTTP GET https://stackoverflow.com/q/978061/283366关于为什么尝试这可能是一个坏主意的额外讨论。

您应该传递查询字符串中所需的所有内容,最好通过params选项,因此它被正确编码...

export const getPostsByKeyword = (keyword, page) =>
  API.get("/post/getPostsByKey", { params: { page, keyword } });

并通过获取数据req.query服务器端。

const { page, keyword } = req.query;

使用普通 JS,您可以使用URL搜索参数 https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams构造查询字符串...

const params = new URLSearchParams({ page, keyword });

// XHR
const xhr = new XMLHttpRequest();
xhr.open("GET", `/post/getPostsByKey?${params}`);

// Fetch
fetch(`/post/getPostsByKey?${params}`); // GET is the default method

您的 Axios 实例创建也可以简单得多......

  1. Axios 通常非常擅长设置正确的content-type标题,你不必
  2. 您的 Express 应用程序不进行任何内容协商,因此您无需设置accept header
  3. 除非您实际上正在使用 cookie(看起来并不像),否则您不需要凭证支持
const API = axios.create({ baseURL });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么express服务器接收到的前端数据是未定义的? 的相关文章

随机推荐

  • Safari 在后台选项卡中延迟 setInterval / setTimeout(间隔 > 1000ms)

    请注意 当页面位于后台选项卡中时 Safari 10 0 3 会延迟我的代码 var interval 2000 var scriptTime new Date getTime function addTime scriptTime int
  • 将数据模型存储到 Flutter Secure Storage 中

    我们如何将模型数据存储到 flutter 安全存储中 或者它支持吗 我有一个这样的模型 我将数据从我的 API 加载到这个模型 一旦我有了数据 我想将其保存到 flutter 安全存储中 反之亦然 将整个数据从 flutter 安全存储加载
  • 是否可以让 Excel 突出显示不符合我所需格式的单元格(例如日期为 6.2.2021 与所需的 6/2/2021)?

    我使用电子表格来确定团队工作流程的优先顺序 某些单元格的突出显示取决于我们与循环时间的接近程度 有开始日期 暂定结束日期和出院日期 如果出现以下情况 空白出院日期单元格将变为红色 开始日期不为空 暂定不为空 今天的日期距离暂定日期不超过五天
  • RVM 和 rbenv 实际上是如何工作的?

    我对 RVM 和 rbenv 的实际工作原理感兴趣 显然 它们在不同版本的 Ruby 和 gemset 之间进行交换 但这是如何实现的呢 我原以为他们只是简单地更新符号链接 但深入研究代码后 我必须承认我对 Bash 的了解很肤浅 他们似乎
  • 使用 ViewModel 设计 MVC 存储库

    我想创建一个存储库类来将我的数据逻辑与控制器分开 我使用 ViewModel 来表示一些数据 这些数据将填充来自不同表的数据 我有一些问题 对于像这样的方法GetAll 我要返回一个IQueryable
  • 根据当前窗口中的半径限制 Google 地图上来自 Instagram API 的帖子

    所以我有下面的代码 它是一个 Node js 应用程序的前端 它使用特定的主题标签提取 Instagram 帖子 现在它在世界各地发布 有没有办法限制帖子的半径 如果可能的话 限制用户当前可见的窗口 我正在使用 Instagram 实时标签
  • 使用实体框架将枚举名称存储在数据库中

    public enum Currency EUR 1 USD 2 GBP 3 假设我有一个如上所示的枚举 如果我要使用实体框架 代码优先 来使用它 那么int值将存储在数据库中 不存储查找表 也不存储枚举值的字符串名称 这使得直接读取数据库
  • 从 javaFX 场景拖放到 Windows 资源管理器

    有什么方法可以从 javaFX 场景拖放到 Windows 资源管理器吗 就在这里 您应该使用 onDragDetected 函数来启动拖放事件 并使用 onDragDone 函数在完成拖放后执行您想要的任何操作 这里有一个例子 final
  • 如何在 iBatis 中映射 List

    我有一堂这样的课 public SomeClass private List
  • 如何在 iOS (ObjC) 中安排每日本地推送通知?

    无法安排每日本地PushNotification以正确的方式 我只想在上午 9 00 显示一个每日本地 PushNotification 其中包含今天的计数任务 我的代码只执行一次didFinishLaunchingWithOptions
  • 如何在android中制作正在运行的应用程序的小部件?

    我想制作我正在运行的应用程序的小部件 我的意思是我想通过主屏幕上的小部件访问我的应用程序 我想拨打电话 向存储在我的应用程序中的特定号码发送短信 在安卓上可以吗 我被困在这个问题上 如果有人有任何类型的想法 请建议我 Edit 我想制作像电
  • 通过宏根据工作表名称重新排序 Excel 工作表

    如果我的 Excel 文档中有 6 个工作表 按以下顺序命名和排列 O1 O2 O3 O1 2 O2 2 O3 3 是否可以编写一个宏来更改这些工作表的顺序 这是我正在寻找的序列 O1 O1 2 O2 O2 2 O3 O3 2 Thanks
  • XCTestExpectation:如何避免在等待上下文结束后调用fulfill方法?

    我正在使用 Xcode 6 的新异步测试功能 当异步任务在超时之前结束时 一切正常 但如果任务花费的时间超过超时时间 事情就会变得更加复杂 这是我进行测试的方式 interface AsyncTestCase XCTestCase end
  • 使用递归查找数组中的最大值

    对于我被要求解决的问题之一 我使用 for 循环找到了数组的最大值 所以我尝试使用递归来找到它 这就是我想到的 public static int findMax int a int head int last int max 0 if h
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • iOS 滑块默认缩略图的大小?

    iOS 滑块的 默认 缩略图的确切尺寸 宽度 高度 是多少 是否有一些聪明的方法可以将其从系统 XCode iOS 中引诱出来 I tried int thumbWidth slider currentThumbImage size wid
  • res.cookie未在浏览器中设置cookie

    我目前正在尝试使用 React 客户端设置 Node Express 应用程序以与之交互 我设置了护照来处理 JWT 身份验证 当用户登录时 我验证电子邮件 密码 然后我设置cookie res cookie jwt token httpO
  • ViewModel 中的 MediaElement.play()

    我正在努力解决以下问题 我正在使用 MVVM 模式构建 WP8 应用程序 我的 view xaml 中有一个媒体元素 并且在 viewmodel cs 中有控制该媒体元素的逻辑 例如 播放 停止 暂停和音量 如何使用绑定从我的视图模型在此媒
  • 表“DBNAME.hibernate_sequence”不存在

    我有一个使用 spring data jpa 的 Spring Boot 2 0 1 RELEASE 应用程序
  • 为什么express服务器接收到的前端数据是未定义的?

    我目前正在开发社交媒体 Mern Stack React 应用程序 我使用 Node js 和 Express 作为我的后端服务 还使用 mongoose 来存储我的数据 并使用 axios 和 redux thunk 将后端连接到前端 到