【发布时间】:2022-11-23 17:14:12
【问题描述】:
我在 useEffect 中有一个异步函数,可以使用 Express.js 根据数据库 (mongodb) 的给定输入获取数据。 在提交表单时,它应该将状态(给定的输入)传递给服务器并查找数据,然后将结果返回给前端。 但是在提交时发送空状态并返回空数组。
反应组件:Compare.js `
import React, { useState, useCallback } from "react";
import { useEffect } from "react";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Result from "./Result";
export default function () {
const [compare, setCompare] = useState({
proId1: "",
proId2: "",
});
function handleChange(event) {
const { value, name } = event.target;
setCompare((prevData) => ({
...prevData,
[name]: value,
}));
}
const fetchData = useCallback(async () => {
const response = await fetch("http://localhost:3000/api/compare", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
proId1: compare.proId1,
proId2: compare.proId2,
}),
});
const data = await response.json();
return data
}, []);
return (
<>
<div>
<h1>ENTER IDS TO COMPARE</h1>
<form>
<input
type="text"
className="proId1"
placeholder="proId1"
name="proId1"
onChange={handleChange}
value={compare.proId1}
/>
<input
type="text"
className="proId2"
placeholder="proId2"
name="proId2"
onChange={handleChange}
value={compare.proId2}
/>
<button
className="submit"
onClick={
React.useEffect(() => {
fetchData()
},[fetchData])
}
>
SUBMIT
</button>
</form>
</div>
<Result />
</>
);
}
` 服务器:
`
app.post("/api/compare", async (req, res) => {
try {
let id1 = await req.body.proId1;
let id2 = await req.body.proId2;
let result = await model.find({ id: { $in: [id1, id2] } })
res.send(result)
} catch (error) {
res.json({ status: "error", error: "error" });
}
});
` 预期要求:
`
{
"proId1":"1",
"proId2":"3"
}
expected Response
[
{
"_id": "637c5dddb9b084433f13d3f7",
"id": "1",
"name": "dffdf",
"price": "100$",
"ratings": "2",
"__v": 0
},
{
"_id": "637c5df3b9b084433f13d3fb",
"id": "3",
"name": "dffdf",
"price": "25$",
"ratings": "5",
"__v": 0
}
]
`
【问题讨论】:
-
在开始请求之前,您是否检查过状态设置是否正确?
-
是的,只要输入框中的值发生变化,我就会设置“比较”状态。
-
那么,如果您在
const response之前的useCallback中使用console.log(compare.proId1, compare.proId2),它会显示正确的值吗? -
不,它也是空的。为什么不设置“比较”?
标签: node.js reactjs react-hooks async-await