У меня большие трудности с получением обратного вызова с помощью axios.post для отправки почты с помощью nodeMailer. Видите ли, электронное письмо отправляется, но буквально не печатает консольный журнал.
Это мой код:
handleSubmit = async(e) => {
e.preventDefault();
const { email, fullname, number, subject, message } = this.state;
await axios.post('/api/form', {
email,
fullname,
number,
subject,
message
})
.then((info)=> {
this.setState({email: '', fullName: '', subject: '', message: ''});
Alert.success('Success.', {
position: 'top-right',
effect: 'jelly',
timeout: 4000
});
console.info(response);
})
.catch((e)=> {
console.info(error);
});
}
А это другой код на сервере (index.js):
const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use((request, response, next) => {
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "Content-Type");
next();
});
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
const path = require('path');
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
}
app.post('/api/form', (req, res) => {
let transporter = nodemailer.createTransport({
host: 'host',
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: '', // generated ethereal user
pass: '' // generated ethereal password
}
});
let mailOptions = {
from: '"New message "<>', // sender address
to: 'me', // list of receivers
subject: 'New message', // Subject line
html: 'Content here' // plain text body// html body
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.info(error);
}
console.info('Message sent: %s', info.messageId);
// Preview only available when sending through an Ethereal account
console.info('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Message sent: <[email protected]>
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});
});
const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
console.info('Server running on port 3001.')
})
В чем здесь проблема? Я пробовал использовать «axios.get» и «axios.request», и это, по крайней мере, выводит ошибку.
@Sabbin В том-то и дело, что это мой код, за исключением того, что у меня, очевидно, есть данные сообщения в моем вызове axios.post. Не могли бы вы поделиться со мной своим кодом?
потому что это асинхронное действие, и вы не ждете ответа
Поделюсь ответом с кодом для node если не ок, удалю
@ Амир-Мусави Амир-Мусави, как мне правильно подойти к этому? Я пробовал использовать async и await, но, возможно, я сделал это неправильно. У вас есть ссылка, с помощью которой вы можете указать мне правильное направление?





Я использую Promise, чтобы дождаться ответа от транспортера и отправить его во внешний интерфейс, где axios проанализирует его.
const sendMail = () => new Promise((resolve, reject) => {
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
reject(error);
} else {
resolve(info);
}
});
})
.....other code.....
const status = await sendMail();
res.json({status})
LE
Основываясь на вашем коде, вот как должен выглядеть маршрут /api/form
app.post('/api/form', async (req, res) => {
const transporter = nodemailer.createTransport({
host: 'host',
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: '', // generated ethereal user
pass: '' // generated ethereal password
},
});
const mailOptions = {
from: '"New message "<>', // sender address
to: 'me', // list of receivers
subject: 'New message', // Subject line
html: 'Content here' // plain text body// html body
};
const sendMail = () => new Promise((resolve, reject) => {
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
reject(error.message);
} else {
resolve(`Message sent: ${info.messageId}`);
}
});
});
const status = await sendMail();
res.json({ status });
});
Большое Вам спасибо. Просто быстрый вопрос, мне вставить этот код на стороне клиента в мою контактную форму или index.js (сервер)?
в server
Это все еще не работает. Я не вижу никакого вывода в консоли. Это потому, что я работаю на сервере разработки?
нет, это не... Я не знаю весь ваш код, чтобы дать вам конкретную помощь... как вы обрабатываете свой маршрут, попадает ли он к нужному контроллеру, выполняет ли ваш контроллер описанную выше функцию.. , довольно сложно просто ответить без всего кода.
Теперь я обновил код почти всем, что я использую. Это помогает? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация от меня.
Я обновил свой ответ на основе вашего кода. Теперь вы должны получить ответ в axios во внешнем интерфейсе.
Вы также можете удалить await в передней части с axios
Вау! Это сработало! Единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что я получаю сообщение об ошибке, когда пытаюсь установить setState afer then(), и оно говорит: TypeError: Cannot read property 'setState' of undefined. В чем здесь проблема? Кстати, большое спасибо!
Я не вижу метод setState в вашем коде React, вы можете обновить код?
Я решил проблему, теперь я обновил код полностью работающим кодом, чтобы все остальные могли проверить, не столкнулись ли они с той же проблемой.
Вы возвращаете
responseиз транспортера? Я используюaxiosиnodemailerв бэкенде, но я не вижу никакого ответа в вашем коде. Вы обрабатываете ответ Promise от транспортера в другом месте?