У меня есть этот код, который возвращает следующую ошибку на req.body.firstname.length
внутри router.use
на странице загрузки:Node.js и Экспресс: Обновление router.get и res.render в объект после загрузки
TypeError: Cannot read property 'length' of undefined
Поскольку уже проверка значение входных форм и значение по умолчанию: undefined
. Я хочу только проверить этот код, когда он получает запрос req.xhr
из формы AJAX, а не на загрузку страницы. Есть ли способ достичь этого?
router.use((req, res, next) => {
if(req.body.firstname.length === 0) {
var validateFirstname = false;
} else {
var validateFirstname = true;
};
if(validateFirstname === true && validateCaptcha === true) {
console.log('SUCCESS: Form validated!');
} else {
console.log('ERROR: Form not validated!');
};
next();
});
Причина, почему это в router.use
, а не в router.post
, потому что я хочу разделить эту логику router.get
также, где мой шаблон рендеринга проживает.
UPDATE:
Вот соответствующий полный код, чтобы получить представление, что происходит:
/////////////////////////////////////////////////////////////
// Nodemailer MIDDLEWARE
/////////////////////////////////////////////////////////////
router.post('/', (req, res, next) => {
const firstname = req.body.firstname;
req.firstname = firstname;
if(req.firstname.length === 0) {
var validateFirstname = false;
} else {
var validateFirstname = true;
};
if(validateFirstname === true) {
console.log('SUCCESS: Form validated!');
// send mail with defined transport object
req.sending = true;
} else {
console.log('ERROR: Form not validated!');
req.sending = false;
};
next();
});
router.use((req, res, next) => {
// create reusable transporter object using the default SMTP transport
req.transporter = nodemailer.createTransport({
...
});
// setup e-mail data with unicode symbols
req.mailOptions = {
...
};
next();
});
/////////////////////////////////////////////////////////////
// Nodemailer
/////////////////////////////////////////////////////////////
router.post('/', (req, res, next) => {
if(!req.xhr && req.sending === true) {
// send mail with defined transport object
req.transporter.sendMail(req.mailOptions, (err, info) => {
if(err) {
console.log('Error occurred');
console.log(err.message);
}
console.log('Message sent successfully!');
console.log('Server responded with "%s"', info.response);
res.send('<div class="form-validation-success">SUCCESS: Message sent successfully!</div>');
});
} else {
res.send('<div class="form-validation-error">ERROR: Message cannot be sent!</div>');
};
/////////////////////////////////////////////////////////////
// INTERNAL API
// GET Contact page
/////////////////////////////////////////////////////////////
router.get('/', (req, res, next) => {
res.render('contact', {
title: 'Contact',
formValidationError: req.displayBlock
});
});
В моем шаблоне handebars:
<div id="responseText"></div>
Этот код теперь работает но не обновляет уже обработанный шаблон просмотра. Я предполагаю только способ решить эту проблему, чтобы обрабатывать ответ сервера с помощью AJAX, но как? Это клиентский код AJAX:
'use strict';
(function() {
document.getElementById('xhr').onclick = function() { makeRequest(); };
function makeRequest() {
var firstname = document.getElementById('firstname').value;
var data = { firstname: firstname };
// instance of a class that provides this functionality
var xhr = new XMLHttpRequest();
// decide what you want to do after you receive the server response to your request
xhr.onreadystatechange = function() {
try {
// process the server response
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// everything is good, the response is received
//alert(xhr.responseText);
document.getElementById('responseText').innerHTML = xhr.responseText;
} else {
// still not ready
alert('There was a problem with the request.');
};
} catch(e) {
console.log('Caught Exception: ' + e.description);
};
};
// make the request
xhr.open('POST', '/en/contact', true);
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.send(JSON.stringify(data));
};
})();
Это всегда возвращает сообщение об ошибке в There was a problem with the request
, даже когда и возвращение xhr.responseText
.
Этот файл маршрутизатора находится в routes/contact.js
и обрабатывает запросы по адресу /:lang/contact
. Вот почему вы видите '/'
url в файле.
Не уверен, если я понимаю, вопрос, нет 'req.body' для запросов GET, как вы хотите использовать что? – gevorg
Полный код добавлен. – Lanti