【问题标题】:Why do I keep getting TypeError: User is not a constructor?为什么我不断收到 TypeError: User is not a constructor?
【发布时间】:2019-06-26 00:44:51
【问题描述】:

我正在练习创建模型和路线,并正在使用邮递员发送一个 POST 请求来测试它。但是,我不断得到用户不是构造函数错误。

index.js(路由)

const express = require('express')
require('./db/mongoose')
const User = ('./models/user')

const app = express()
const port = process.env.PORT || 3000

app.use(express.json())

app.post('/users', (req, res) => {
    const user = new User(req.body)

    user.save().then(() => {
        res.send(user)
    }).catch(() => {

    })
})

app.listen(port, () => {
    console.log(port + ' is aliiiiiiiive!')
})

用户(架构)

const mongoose = require('mongoose')
const validator = require('validator')

const User = mongoose.model('User', { 
    name: {
        type: String,
        required: true, 
        trim: true
    }, 
    email: {
        type: String,
        require: true,
        trim: true, 
        lowercase: true,
        validate(value) {
            if(!validator.isEmail(value)) {
                throw new Error('Email is invalid')
            }
        }
    },
    age: {
        type: Number,
        default: 0,
        validate(value) {
            if(value < 0) {
                throw new Error('Age must be a positive number.')
            }
        }
    },
    password: {
        type: String,
        trim: true,
        lowercase: true,
        required: true,
        minlength: 7,
        validate(value) {
            if( value.toLowerCase().includes("password")) {
                throw new Error("Password can't be 'password'.")
            }
        }
    }
})

module.exports = User

mongoose.js

const mongoose = require('mongoose')

mongoose.connect('mongodb://127.0.0.1:27017/task-manager-api', {
    useNewUrlParser: true,
    useCreateIndex: true
})

我希望它发回一个对象,其中包含我在 Postman 上发送的以下信息:

{
    "name": "Michael",
    "email": "email@eail.com",
    "password": "ThisIsAPassword"
}

【问题讨论】:

  • mongoose.model的第二个属性不是对象,而是mongoose.Schema

标签: javascript node.js express mongoose


【解决方案1】:

你必须在编译模型之前定义一个 userSchema,像这样:

const mongoose = require('mongoose')
const validator = require('validator')

const userSchema = new mongoose.Schema({ 
    name: {
        type: String,
        required: true, 
        trim: true
    }, 
    email: {
        type: String,
        require: true,
        trim: true, 
        lowercase: true,
        validate(value) {
            if(!validator.isEmail(value)) {
                throw new Error('Email is invalid')
            }
        }
    },
    age: {
        type: Number,
        default: 0,
        validate(value) {
            if(value < 0) {
                throw new Error('Age must be a positive number.')
            }
        }
    },
    password: {
        type: String,
        trim: true,
        lowercase: true,
        required: true,
        minlength: 7,
        validate(value) {
            if( value.toLowerCase().includes("password")) {
                throw new Error("Password can't be 'password'.")
            }
        }
    }
})

const User = mongoose.model('User', userSchema);
exports.User = User

现在它是一个构造函数,因为我们说User 的每个实例都是newuserSchema 实例。

【讨论】:

    【解决方案2】:

    我想通了。在我的 index.js 文件的第三个中,我省略了 require。

    而不是这个:

    const User = ('./models/user')
    

    应该是这样的:

    const User = require('./models/user')
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2014-10-06
      • 2020-09-13
      • 2022-06-22
      • 2019-07-15
      • 2018-05-24
      • 2015-08-10
      相关资源
      最近更新 更多