MERN栈电影评价应用报错addReview is not a function如何解决?
报错根本原因
你在ReviewsDAO类中定义的addReview是静态方法,静态方法归属于类本身,只能通过类名直接调用,不能通过类的实例对象调用。
你在reviews.controller.js中先执行了const reviewsDAO = new ReviewsDAO()实例化类,再用实例对象调用addReview方法,自然会报方法不存在的错误。
修复方案
1. 修改reviews.controller.js的调用逻辑
删除实例化ReviewsDAO的代码,直接用类名调用静态方法,修改后代码如下:
import ReviewsDAO from '../dao/reviewsDAO.js' export default class ReviewsController{ static async apiPostReview(req,res,next) { try{ const movieId = req.body.movie_id const review = req.body.review const userInfo = { name: req.body.name, _id: req.body.user_id } const date = new Date() // 直接用类名调用静态方法,无需实例化 const ReviewResponse = await ReviewsDAO.addReview( movieId, userInfo, review, date ) res.json({status: "success"}) } catch(e) { res.status(500).json({error: e.message}) } } }
2. 确认数据库注入逻辑正常
你需要确保项目启动、MongoDB连接成功后,已经调用过ReviewsDAO.injectDB方法完成集合初始化,否则addReview内部用到的reviews变量会是undefined,同样会导致报错。
参考入口文件(如server.js)的连接逻辑:
import ReviewsDAO from './dao/reviewsDAO.js' // MongoDB连接逻辑 mongodb.MongoClient.connect( process.env.MOVIEREVIEWS_DB_URI, { maxPoolSize:50, wtimeoutMS:2500, useNewUrlParser:true } ) .catch(err => { console.error(err.stack) process.exit(1) }) .then(async client => { // 必须执行这一步完成集合注入 await ReviewsDAO.injectDB(client) app.listen(port, () => { console.log(`服务已启动,监听端口${port}`) }) })
额外检查项
确认reviews.controller.js中导入ReviewsDAO的文件路径和你项目的实际文件路径一致,路径错误也会导致导入对象异常,调用方法时报错。
补充说明
你对MongoDB集合的判断正确,默认MongoDB会在第一次插入对应集合的文档时自动创建不存在的集合,上述问题修复后首次插入评价成功,reviews集合就会自动生成。
内容的提问来源于stack exchange,提问作者Ricky Drennan
相关产品推荐
相关产品推荐

