从MongoDB获取数据后无法访问JavaScript对象成员
问题原因&解决方案
你遇到的问题其实是Mongoose查询方法的特性导致的:User.find()返回的是一个文档数组,而不是单个文档对象,哪怕你的查询条件只匹配了一条数据,它依然会把这条数据包裹在数组里返回。所以你直接访问user.username的时候,本质是在给数组这个对象找username属性,自然拿不到值。
给你两个解决思路:
1. 改用findOne()(更推荐)
因为用户名通常是唯一的,用findOne()会直接返回匹配的第一个单个文档对象,这样就能正常访问username等成员了:
socket.on("getUser", function(username){ User.findOne({username: username}, function (err, user) { console.log("*** " + user + " \n*** " + typeof user); // 加个可选链避免没找到用户时报错 console.log(user?.username); if (err) { console.log(err); return; } socket.emit("getUserResponse", user); }) });
2. 如果坚持用find(),取数组第一个元素
要是你因为某些原因必须用find(),记得从返回的数组里取出第一个元素再操作:
socket.on("getUser", function(username){ User.find({username: username}, function (err, users) { // 变量名改成users更直观,提醒自己这是个数组 if (err) { console.log(err); return; } const user = users[0]; console.log("*** " + user + " \n*** " + typeof user); console.log(user?.username); socket.emit("getUserResponse", user); }) });
另外建议你在处理查询结果时,先判断下user是否存在(比如if (!user) { /* 处理用户不存在的情况 */ }),避免后续操作出现意外报错~
内容的提问来源于stack exchange,提问作者Sandy Leach
相关产品推荐
相关产品推荐

