reactjs - 使用钩子在 React 中引用 MongoDB ObjectID 会导致 TypeError: Cannot read property '$oid' of undefined
问题描述
当作为 useSelector React 钩子的一部分引用时,访问 MongoDB 返回的 ObjectID 字符串时,我似乎遇到了问题,但这在同一应用程序的其他地方不是问题。键名中的 $ 符号有问题吗?
我的 api 调用返回这个
{"_id": {"$oid": "5e121d3d52d781668fbc619c"}, "name": "Foo Document Name"}
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import axios from 'axios';
import { Link } from 'react-router-dom';
import { setFoo } from '../../actions';
function FooInfo(props) {
const foo = useSelector(state => state.foo);
console.log('after useSelector', foo);
const dispatch = useDispatch();
useEffect(function() {
console.log('useEffect', props.match);
axios.get(`/api/foo/${props.match.params._id}`, {headers: {'content-type': 'application/json’}})
.then(function(response) {
dispatch(setFoo(response.data));
})
.catch(function(error) {
console.log('error', error);
});
}, [dispatch, props]);
return (
<div>
<h2>{foo.name}</h2>
<small>id: {foo._id.$oid}</small>
<hr/>
</div>
)
}
来自动作/index.js
…
export const SET_FOO = 'SET_FOO’;
export function setFoo(foo) {
return {
type: SET_FOO,
foo: foo,
_id: foo._id.$oid
};
};
我知道这一行有效_id: foo._id.$oid
,因为 useSelector 行之后的 console.log 显示:
after useSelector
• {_id: {…}, name: “Foo Document Name"}
• _id:
• $oid: "5e121d3d52d781668fbc619c"
• __proto__: Object
• name: "Foo Document Name"
• __proto__: Object
并且动作对象持有:
action
• {type: "SET_FOO”, foo: {…}, _id: "5e121d3d52d781668fbc619c"}
• type: "SET_FOO"
• foo:
• _id: {$oid: "5e121d3d52d781668fbc619c"}
• name: "Foo Document Name"
• __proto__: Object
• _id: "5e121d3d52d781668fbc619c"
• __proto__: Object
浏览器给出这个错误:
TypeError: Cannot read property '$oid' of undefined
如果我从 id: {foo._id.$oid} 中删除 .$oid 我会在浏览器中收到此错误:
Error: Objects are not valid as a React child (found: object with keys {$oid}). If you meant to render a collection of children, use an array instead.
foo._id 不能未定义,因为删除 .$oid 表明 foo._id 包含某些内容。
这对我来说似乎是反应钩子的问题,但我是新手,所以我不相信我的观点。我相信可能是这种情况,因为将 useSelector 行更改为: const [foo, tempID] = useSelector(state => [state.foo, state.foo._id.$oid]); 也给出了 TypeError。
解决方案
推荐阅读
- arrays - TArray 的排序问题
对于大数 - java - 如何使驱动程序类中的方法看到另一个类的子类?
- android - webview内的内部滚动,放置在SwipeRefreshLayout内向上滚动时不起作用
- java - 使用 Jackson 将 JSON 映射到 POJO
- tkinter - 添加标签时列表框调整大小:tkinter
- reactjs - Material-UI 中的颜色枚举“继承”和“默认”是什么意思?
- angular - 部署到heroku后缺少标志问题
- typescript - 在 ng 动态表单中使用 DynamicRadioGroupModel 中的按钮单击事件更改值
- java - 用于查找矩阵中 1 数量的算法(仅垂直 1)。图像是不言自明的,我到底想要什么
- c++ - 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?