Node.js开发心愿单后端报Cannot read property 'find' of undefined错误求解决
问题排查与修复方案
核心报错原因
你遇到的TypeError: Cannot read property 'find' of undefined报错的直接诱因是变量命名冲突:
你在addToWishlist函数内声明了一个和导入的wishlist模型同名的局部变量:
// 错误写法:局部变量wishlist覆盖了全局导入的wishlist模型 let wishlist = await wishlist.find({"username" : `${req.query.username}`}).exec()
执行这行代码时,当前块级作用域内的wishlist局部变量会优先被读取,此时它还没完成赋值,值为undefined,调用find方法自然会报错。
其他潜在问题
- 混用
async/await和.then回调,代码逻辑混乱,且没有添加错误捕获逻辑,才会触发UnhandledPromiseRejectionWarning未处理的Promise拒绝警告 - 用户存在性判断逻辑错误:
User.find返回的是数组,你用user != 0判断不准确,应该判断数组长度user.length > 0 - 所有数据库查询后都没有做空值判断,比如书籍不存在、用户还未创建心愿单的场景下,直接访问数组下标
[0]的属性会直接报错 - 你导入了
wishlistSchema但没有使用,如果你导入的wishlist已经是在模型文件中注册好的Mongoose模型则可以删除多余导入,否则你需要和Books一样给wishlistSchema注册模型
修复后代码
import mongoose from 'mongoose'; import express from 'express'; // 导入的模型建议首字母大写,和普通变量做区分 import Wishlist from '../models/wishlist_model.js'; import User from '../models/user_model.js'; import { BooksSchema } from '../models/books_model'; const Books = mongoose.model('Books', BooksSchema); const app = express(); app.use(express.json()); // 创建心愿单 export const createWishlist = async (req, res, next) => { try { const user = await User.find({"username": req.body.username}).exec(); if (user.length === 0) { return res.status(400).json({msg: "User does not exist"}); } const wish = new Wishlist({ wishlist_id: new mongoose.Types.ObjectId(), _id: user[0]._id, username: req.body.username }); await wish.save(); res.status(201).json({ msg: `Wishlist created for ${req.body.username}` }); } catch (err) { console.error(err); res.status(500).json({msg: "Server error"}); } }; // 添加商品到心愿单 export const addToWishlist = async (req, res, next) => { try { // 查询要添加的书籍 const bookToAdd = await Books.find({"isbn": req.query.isbn},{"title": 1 , "price": 1}).exec(); if (bookToAdd.length === 0) { return res.status(400).json({msg: "Book does not exist"}); } const bookTitle = bookToAdd[0].title; // 查询用户 const wishOwner = await User.find({"username": req.query.username}).exec(); if (wishOwner.length === 0) { return res.status(400).json({msg: "User does not exist"}); } // 查询用户心愿单,注意局部变量不要和导入的模型重名 const userWishlist = await Wishlist.find({"username": req.query.username}).exec(); if (userWishlist.length === 0) { return res.status(400).json({msg: "User has not created a wishlist yet"}); } const newWishBooks = userWishlist[0].books; newWishBooks.push(bookTitle); // 更新心愿单 await Wishlist.updateOne( { "username": req.query.username }, { $set: { books: newWishBooks } } ); res.json({ msg: `Successfully added ${bookTitle} to ${wishOwner[0].username}'s Wishlist!` }); } catch (err) { console.error(err); res.status(500).json({msg: "Server error"}); } }
内容的提问来源于stack exchange,提问作者MFuen2002
相关产品推荐
相关产品推荐

