使用Mongoose Schema时出现“User is not a constructor”错误求助
解决Mongoose "User is not a constructor" 错误
我来帮你排查这个问题,你遇到的这个错误主要是两处写法失误导致的,下面一步步给你拆解清楚:
错误1:模型导入方式错误
在你的api.js里,导入User模型时直接赋值了文件路径字符串,没有用require方法加载模块,这会导致User只是一个普通字符串,而非Mongoose提供的模型构造函数。
修正前的api.js代码片段:
var User = '../models/userschema';
修正后:
var User = require('../models/userschema');
错误2:模型导出语法错误
在userschema.js里,导出模型时第一个参数应该是字符串类型的模型名称(对应MongoDB中的集合名,Mongoose会自动转为复数形式),但你写的User是未定义的变量,语法完全错误。
修正前的userschema.js代码片段:
module.exports = mongoose.model(User,UserSchema)
修正后:
module.exports = mongoose.model('User', UserSchema);
完整修正后的代码
api.js
var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); const Schema = mongoose.Schema; const db = 'mongodb://localhost:27017/stfe'; mongoose.connect(db,(err) => { if(err) { console.log("error"); } else { console.log("DB connected at port 27017"); } }); // 修正:使用require正确导入模型 var User = require('../models/userschema'); /* GET home page. */ router.get('/', function(req, res, next) { res.send("hello from the backend"); }); const newUser = { firstname:"Asim", lastname:"Dahal", email:"arsenalsim@gmail.com", password:12321, cell_number:222, alternate_number:111 }; router.get('/insertuser', function(req, res, next) { var user = new User({ firstname:"asim", lastname:"dahal", email:"arsenalasim@gmail.com", password:"12321", cell_number:12321, alternate_number:12321 }); user.save((err) => { if(err) { console.log(err); res.send('Failed to save user'); } else { console.log('saved'); // 补充:给前端返回响应,避免请求挂起 res.send('User saved successfully'); } }); }); module.exports = router;
userschema.js
const mongoose = require('mongoose'); const Schema = mongoose.Schema; var UserSchema = new Schema({ firstname: { type: String, required: true }, lastname: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, cell_number: { type: Number, required: true }, alternate_number: { type: Number, required: true } }); // 修正:正确导出Mongoose模型 module.exports = mongoose.model('User', UserSchema);
额外提个小建议:在/insertuser接口里,无论保存成功还是失败,都记得给前端返回响应(比如上面代码里加的res.send),不然前端请求会一直处于挂起状态,直到超时。
内容的提问来源于stack exchange,提问作者Asim Dahal
相关产品推荐
相关产品推荐

