Node.js+MongoDB用户注册报错:TypeError: Utente is not a constructor
问题解决:TypeError: Utente is not a constructor
核心原因:导入方式不匹配
你的utente.js使用默认导出(module.exports = Utente),但控制器中错误使用了解构导入(const { Utente } = require("../models/utente")),导致Utente变量为undefined,无法作为构造函数调用。
修复步骤1:修正导入语句
将控制器里的导入改为默认导入:
const Utente = require("../models/utente");
额外需要修复的逻辑问题
除了构造函数错误,代码还有几处功能缺陷:
1. 重复邮箱校验逻辑错误
utente.findOne({email: request.body.email})是错误用法——findOne是mongoose模型的静态方法,不能调用实例的该方法,且校验需要异步执行,必须加await:
// 替换原校验逻辑 const existingUser = await Utente.findOne({ email: request.body.email }); if (existingUser) { return response.status(400).send('Esiste già un account con questa email'); }
2. 未定义字段会被忽略
你的Utente模型Schema中没有cellulare字段,mongoose默认会丢弃未定义的字段。如果需要存储该字段,需在模型中添加:
// utente.js中更新Schema new mongoose.Schema({ email: String, nome: String, cognome: String, password: String, admin: String, cellulare: String // 添加此字段 })
3. 异步保存需处理异常
utente.save()是异步操作,需添加await并捕获可能的错误:
try { await utente.save(); response.status(201).json({ messages: "Utente Registrato con Successo", }); } catch (err) { return response.status(500).json({ message: "Errore nel salvataggio utente", error: err.message }); }
修复后的完整控制器代码
const { validationResult } = require("express-validator"); const Utente = require("../models/utente"); // 修正导入 exports.registrazione = async (request, response, next) => { const errors = validationResult(request); if (!errors.isEmpty()) { return response.status(422).json({ message: "Errore nell'Inserimento dei Dati", error: errors.array(), }); } console.log("Email:", request.body.email); try { // 校验邮箱是否已存在 const existingUser = await Utente.findOne({ email: request.body.email }); if (existingUser) { return response.status(400).send('Esiste già un account con questa email'); } const utente = new Utente({ email: request.body.email, nome: request.body.nome, cognome: request.body.cognome, password: request.body.password, cellulare: request.body.cellulare, admin: request.body.admin }); await utente.save(); // 异步保存用户 response.status(201).json({ messages: "Utente Registrato con Successo", }); } catch (err) { return response.status(500).json({ message: "Errore durante la registrazione", error: err.message }); } };
内容的提问来源于stack exchange,提问作者kevinpcf
相关产品推荐
相关产品推荐

