2016-05-22 1 views
0

У меня есть этот код, который возвращает следующую ошибку на 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 в файле.

+0

Не уверен, если я понимаю, вопрос, нет 'req.body' для запросов GET, как вы хотите использовать что? – gevorg

+0

Полный код добавлен. – Lanti

ответ

0

не могли бы вы добавить дополнительную информацию об этом .... поскольку очень сложно выяснить проблему с этой информацией.

вы пытаетесь пост на URI/ен/контакт но получив запрос на/

+0

Извините, я не разбираюсь в этом. Это маршрутизатор, который находится на 'routes/contact.js' и обрабатывает запросы в' /: lang/contact'. – Lanti

Смежные вопросы