You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:39:01