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的方法。
我正在按照教程在 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的方法。