Error: addReview is not a function in MERN application

Error: addReview is not a function in MERN application

我正在按照教程在 MERN 堆栈上创建电影评论应用程序。

使用 Insomnia 调用我的 API 时,出现错误“ReviewsDAO.addReview 不是函数”

reviewsDAO.js:

import mongodb from "mongodb"
const ObjectId = mongodb.ObjectId

let reviews

export default class ReviewsDAO{

    static async injectDB(conn){
        if(reviews){
            return
        }
        try { reviews = await conn.db(process.env.MOVIEREVIEWS_NS).collection('reviews')}
        catch(e){
            console.error(`unable to establish connection handle in reviewDAO: ${e}`)
        }
    }

    static async addReview(movieId, user, review, date){
        try{
            const reviewDoc = {
                name: user.name,
                user_id: user._id,
                date: date,
                review: review,
                movie_id: ObjectId(movieId)
            }
            return await reviews.insertOne(reviewDoc)
        }
        catch(e) {
            console.error(`unable to post review ${e}`)
            return {error: e}
        }
    }

reviews.controller.js:

import ReviewsDAO from '../dao/reviewsDAO.js'

export default class ReviewsController{
   

    static async apiPostReview(req,res,next) {
        const reviewsDAO = new ReviewsDAO()
        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})
        }
        }

评论集合也未在 MongoDB 中创建。但也许在我们创建第一个评论之前不应该发生这种情况。

为什么我的函数没有被正确调用?

您需要实例化 ReviewsDAO 对象才能调用其方法。

const reviewsDAO = new ReviewsDAO()

然后您将能够访问 addReview() 方法

您正在调用 class 方法,但没有初始化对象。

例如:

class Animal{
  function sayhello(){
   console.log("Hello")
  }
}
// I can call the sayhello method by creating an object.
var dog=new Animal()
dog.sayhello() //prints "Hello"

但是在你的例子中,你是在调用方法而不创建对象。

Animal.sayhello() 
// It will create an error

所以初始化对象并调用方法

const reviewsDAO = new ReviewsDAO()
reviewDAO.addreviews()

static 关键字为 classes 定义了静态方法。

直接在 class(上例中的 Car)上调用静态方法 - 无需创建 class

的 instance/object(mycar)

所以

const Reviewsdao= new ReviewsDAO()
ReviewsDAO().addreviews()

初始化后调用名称为class的方法。