node.js - 在 React Redux-Saga Express Nodejs 环境中,req.body 在路由器中未定义
问题描述
我已经阅读了其他在 StackOverflow 上返回 undefined 的 req.body 示例,但没有遇到之前提出的任何解决方案解决了我的问题。
我在 React Express Node.js 环境中工作。我对正在运行的服务器有其他 GET 请求,但是当我从路由器注销“req.body”时,我有一个返回“未定义”的 GET 请求。
我的 Express 服务器配置如下:
const express = require("express");
require("dotenv").config();
const app = express();
const bodyParser = require("body-parser");
const sessionMiddleware = require("./modules/session-middleware");
const passport = require("./strategies/user.strategy");
// Body parser middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// Route includes
const userRouter = require("./routes/user.router");
const bucketRouter = require("./routes/bucket.router");
const UploaderS3Router = require("react-dropzone-s3-uploader/s3router");
const imageRouter = require("./routes/image.router");
// Passport Session Configuration //
app.use(sessionMiddleware);
// start up passport sessions
app.use(passport.initialize());
app.use(passport.session());
/* Routes */
app.use("/api/user", userRouter);
app.use("/api/user", bucketRouter);
app.use("/api/imageurl", imageRouter);
//aws route
app.use(
"/s3",
UploaderS3Router({
bucket: "annesbucket", // required
region: "us-east-2", // optional
headers: { "Access-Control-Allow-Origin": "*" }, // optional
ACL: "public-read", // this is the default - set to `public-read` to let anyone view uploads
})
);
// Serve static files
app.use(express.static("build"));
// App Set //
const PORT = process.env.PORT || 5000;
/** Listen * */
app.listen(PORT, () => {
console.log(`Listening on port: ${PORT}`);
});
我正在使用 redux saga 发出 GET 请求并将有效负载从 req.body 传递到服务器,它看起来像这样:
import axios from "axios";
import { put, takeLatest } from "redux-saga/effects";
function* getPhotosExperiences(action) {
try {
const userID = action.payload.userID;
const config = {
headers: { "Content-Type": "application/json" },
withCredentials: true,
};
const response = yield axios.get(
`/api/imageurl/photoexperience/${userID}`,
action.payload
// config
);
console.log(action.payload);
yield put({
type: "SET_PHOTOS_EXPERIENCES",
payload: response.data,
});
console.log(response.data);
} catch (err) {
console.log("error getting list items:", err);
}
}
function* getPhotosExperiencesSaga() {
yield takeLatest("GET_PHOTOS_EXPERIENCES", getPhotosExperiences);
console.log("getPhotosExperiences fired off");
}
export default getPhotosExperiencesSaga;
同样,当我在我的传奇中注销“action.payload”时,我看到了我想要传递给服务器的数据。
无法识别 req.body 的 GET 请求位于在服务器中注册为 imageRouter 的路由器中。
这是我的 GET 请求:
router.get("/photoexperience/:userID", rejectUnauthenticated, (req, res) => {
console.log(
"this is what the server is getting:",
req.body.userID,
req.body.experienceID
);
console.log("req.params.id is:", req.params.id);
console.log("this is req:", req);
const experienceID = req.body.experienceID;
const queryText = `SELECT "user_photos_experiences".experience_id, "user_photos_experiences".photo_id, "photos".experience_photo
FROM "user_photos_experiences"
JOIN "photos" ON "user_photos_experiences".photo_id = "photos".id WHERE "user_photos_experiences".experience_id = $1`;
pool
.query(queryText, [experienceID])
.then((responseDB) => {
const dbRows = responseDB.rows;
console.table(dbRows);
res.send(dbRows);
})
.catch((err) => {
console.log("error getting photos from photoexperience:", err);
res.sendStatus(500);
});
});
我会很感激另一双眼睛 - 它已经困扰了我好几个小时了!
TLDR;我想知道如何从我的服务器端路由器中访问我从我的传奇中发送的有效负载。
解决方案
我找到了解决这个问题的方法,以防其他人在使用 PostgreSQL 时遇到类似问题。我不需要将我的经验存储在 req.body 上,而是将其存储在 req.query 上,即:
router.get("/photoexperience/:userID", rejectUnauthenticated, (req, res) => {
console.log(
"this is what the server is getting:",
req.query.userID,
req.query.experienceID
);
console.log(req.query);
// res.header("Access-Control-Allow-Origin", "*");
const userID = req.query.userID;
const queryText = `SELECT "user_photos_experiences".experience_id, "user_photos_experiences".photo_id, "photos".experience_photo, "user_photos_experiences".user_id
FROM "user_photos_experiences"
JOIN "photos" ON "user_photos_experiences".photo_id = "photos".id WHERE "user_photos_experiences".user_id = $1;`;
pool
.query(queryText, [userID])
.then((responseDB) => {
const dbRows = responseDB.rows;
console.table(dbRows);
res.send(dbRows);
})
.catch((err) => {
console.log("error getting photos from photoexperience:", err);
res.sendStatus(500);
});
});
这修复了我的 GET 请求 :) 关于 req.body 和 req.query 之间差异的信息在这里得到了回答:express:req.query 和 req.body 之间的区别是什么。
推荐阅读
- asp.net - 如何通过通往公共 URL 的隧道免费托管我的 ASP.NET localhost 网站?
- python - Pip安装问题
- c# - 同一个字段名在类或其父类中被序列化多次
- bash - 为什么测试第一个字符会跳过空行?
- tcp - 如何使每个 MQTT Publih 消息在单独的数据包中?
- sql-server - SQL server 位类型 Access 链接表
- coded-ui-tests - 如何在codedui中选择正确的组合框
- azure - 如何从 azure 数据湖中读取行分隔的 json 文件并使用 usql 进行查询
- powershell - 将 dir 输出作为参数传递给另一个命令
- python - Django REST Framework,保存到自定义用户模型的额外字段