Необработанное обещание Предупреждение: Ошибка проверки: Попытка получить данные из коллекции для возврата электронной почты завершается неудачей

#node.js #rest #nodemailer

Вопрос:

Я получаю эту ошибку

 PS D:node_appsBackend-node_backendgt; npm start gt;  gt; gt; onepercentcrm@1.0.0 start D:node_appsBackend-node_backend gt; gt; node app.js gt;  gt; Listening on port 5000 Connected to DB (node:29312) gt; UnhandledPromiseRejectionWarning: ValidationError: UsersAdminList gt; validation failed: admin_email: Cast to string failed for value "[ { gt; _id: new ObjectId("61a89e4fbd7d1bc03825d3bd"), gt; superadmin_name: 'Sam Holland', gt; superadmin_email: '*********@hotmail.com', gt; __v: 0, gt; superadmin_pass: '$2b$10$O3TKhwEQA9YpTYA8DsbyfO/hXwdzxAXQ7.rwvz/XcvqJ1WMoWn/Ii' } ]" gt; (type Array) at path "admin_email" gt; at model.Document.invalidate (D:node_appsBackend-node_backendnode_modulesmongooselibdocument.js:2869:32) gt; at model.$set (D:node_appsBackend-node_backendnode_modulesmongooselibdocument.js:1420:12) gt; at model.$set (D:node_appsBackend-node_backendnode_modulesmongooselibdocument.js:1122:16) gt; at model.Document (D:node_appsBackend-node_backendnode_modulesmongooselibdocument.js:150:12) gt; at new model (D:node_appsBackend-node_backendnode_modulesmongooselibmodel.js:4746:15) gt; at RegisterAdminUser (file:///D:/node_apps/Backend-node_backend/controller/AdminUserListController/AdminUserListController.js:58:21) gt;  gt; at processTicksAndRejections (internal/process/task_queues.js:95:5) (Use `node --trace-warnings gt; ...` to show where the warning was created) (node:29312) gt; UnhandledPromiseRejectionWarning: Unhandled promise rejection. This gt; error originated either by throwing inside of an async function gt; without a catch block, or by rejecting a promise which was not handled gt; with .catch(). To terminate the node process on unhandled promise gt; rejection, use the CLI flag `--unhandled-rejections=strict` (see gt; https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). gt; (rejection id: 1) (node:29312) [DEP0018] DeprecationWarning: gt; Unhandled promise rejections are deprecated. In the future, promise gt; rejections that are not handled will terminate the Node.js process gt; with a non-zero exit code. Terminate batch job (Y/N)? y PS gt; D:node_appsBackend-node_backendgt;  

Теперь я пытаюсь что-то сделать, чтобы получить адрес электронной почты администратора, чтобы я мог использовать Nodemailer для автоматической отправки электронных писем, возможно. Таким образом, API REST должен получать электронную почту из коллекции (таблицы) SuperAdminListModel.find , а затем отправлять ее администратору и конечному пользователю.

Мой исходный код выглядит так

 import AdminListModel from "../../model/AdminUserList/AdminUserList.js"; import SuperAdminListModel from "../../model/SuperAdminModel/SuperAdminModel.js"; import services from "../../utils/services.js"; import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; import nodemailer from "nodemailer";   const dispatch_emails =(admin_email, email, fullname, company_name) =gt;{  const transporter = nodemailer.createTransport({  service: 'gmail',  host: 'smtp.gmail.com',  port: '587',  auth: {  user: '*************@gmail.com',  pass: '************'  },  secureConnection: 'false',  tls: {  ciphers: 'SSLv3',  rejectUnauthorized: false  }  });   const mailOptions = {  from: '*********@gmail.com',  to: email,  subject: 'Account Registration Successful!',  html: 'lt;h3gt;Attention,'   fullname   ' , lt;/h3gt;lt;pgt;lt;h3gt;Your Account has been successfully setup.lt;/h3gt;lt;/pgt;lt;pgt; Please allow a maximum of 24 - 48 Hours for Review and succesful setup and approval of your online account.lt;/pgt;lt;/brgt;Regards,lt;/brgt; Online Services.'  };   const AdminNotifyEmail = {  from: '************@gmail.com',  to: admin_email,  subject: 'Account Registration for '   email   ', with Fullname : '   fullname   ' ('   company_name   ')',  html: 'lt;h3gt;Attention Admin , lt;/h3gt;lt;pgt;A new User has registered his Access with the following Information: lt;/brgt; lt;stronggt;Username : '   email   'lt;/stronggt;lt;/brgt;lt;stronggt;Company Name : '   company_name   'lt;/stronggt;lt;/brgt;lt;stronggt;Date of Registration: '   (new Date()).toLocaleString()   'lt;/stronggt;lt;/brgt;Regardslt;/brgt;Online Services.lt;/pgt;'  };   transporter.sendMail(mailOptions, function (error, info) {  if (error) throw error;  return res.send({ error: false, data: info, message: 'OK' });  })   transporter.sendMail(AdminNotifyEmail, function (error, info) {  if (error) throw error;  return res.send({ error: false, data: info, message: 'OK' });  }) }  export const RegisterAdminUser = async (req, res) =gt; {  const superadmin_email = await SuperAdminListModel.find({});  const existingUser = await AdminListModel.findOne({  $or: [{ email: req.body.email }],  });  if (existingUser) {  return res.status(409).json({ errors: { email: "User already exists" } });  }  const newUser = new AdminListModel({  admin_email : superadmin_email,  company_name: req.body.company_name,  fullname: req.body.fullname,  email: req.body.email,  phone_number: req.body.phone_number,  timezone: req.body.timezone  });   const payload1 = {  _id: newUser._id,  };   await newUser.save()  const token = jwt.sign(payload1, services.JWT_KEY, {  expiresIn: 31556926,  });   bcrypt.genSalt(10, (err, salt) =gt; {  if (err) {  // console.log(err);  return res.status(500).json({ error: err });  }  bcrypt.hash(req.body.password, salt, async (err, hash) =gt; {  if (err) {  // console.log("err: ", err);  return res.status(500).json({ error: err });  }  newUser.password = hash;  await newUser.save();  dispatch_emails(admin_email, newUser.email, newUser.fullname, newUser.company_name);  const payload = {  _id: newUser._id,  email: req.body.email,  };  const token = jwt.sign(payload, services.JWT_KEY, {  expiresIn: 31556926,  });  })  return res.status(200).json({  message: "User registered Successfully",  token: token,  user: newUser,  });  }) };   export const listUsers = async (req, res) =gt; {  /*const userId = req.query.userId || req.user._id;  // console.log(userId);  const currentUser = await SuperAdminListModel.findById(userId);   if (!currentUser) {  return res.status(401).json({ error: "User not found" });  }   */  AdminListModel.find({}).exec(function (err, users) {  if (err) {  return res.status(500).json({ error: err });  } else {  res.json({ message: 'OK', data: users })  }  }) };  

Правки

Мои схемы для них обоих выглядят следующим образом

 import Mongoose from "mongoose";  const AdminUserListSchema = new Mongoose.Schema({  admin_email :{  type:String,  },  company_name :{  type:String,  trim:true,  required:true  },  fullname :{  type:String,  trim:true,  required:true  },  email:{  type:String,  unique:true,  lowercase:true,  trim:true,  required:true  },  phone_number :{  type:String,  trim:true,  required:true  },  password:{  type:String  },  timezone:{  type:String,   },  created:{  type: Date,  default: Date.now  } });  const AdminListModel = Mongoose.model('UsersAdminList', AdminUserListSchema); export default AdminListModel;  

Комментарии:

1. Можете ли вы опубликовать свое AdminListModel определение схемы?

2. @LucaPizzini, пожалуйста, смотрите Правки

Ответ №1:

Проблема в том, что вы передаете массив JSON в admin_email поле, которое имеет тип string .
Запрос с find({}) вернет список объектов.

Вам следует либо:

  1. Отфильтруйте SuperAdminListModel с findOne , чтобы вернуть один объект, и назначьте superadmin_email свойству, если объект не пуст
 const superadminUser = await SuperAdminListModel.findOne({ // Filter by some condition });  const newUser = new AdminListModel({  admin_email: superadminUser ? superadminUser.superadmin_email : '',  ...  });  
  1. Отфильтруйте результат find({}) запроса, чтобы получить один объект и назначить его superadmin_email admin_email
 const superadminList = await SuperAdminListModel.find({});  const superadminUser = superadminList.find(admin =gt; // Filter by some condition)  const newUser = new AdminListModel({  admin_email: superadminUser ? superadminUser.superadmin_email : '',  ...  });