You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:40:43