#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({})
вернет список объектов.
Вам следует либо:
- Отфильтруйте
SuperAdminListModel
сfindOne
, чтобы вернуть один объект, и назначьтеsuperadmin_email
свойству, если объект не пуст
const superadminUser = await SuperAdminListModel.findOne({ // Filter by some condition }); const newUser = new AdminListModel({ admin_email: superadminUser ? superadminUser.superadmin_email : '', ... });
- Отфильтруйте результат
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 : '', ... });