2016-05-16 6 views
1

Я относительно новичок в NodeJS, и я изучаю эту серию учебников.Ошибка NodeJS - Невозможно установить заголовки после их отправки

https://www.youtube.com/watch?v=49sWXJPk10Q&list=PLO-hrPk0zuI18xlF_480s6UiaGD7hBqJa&index=15

В данном видео я получаю некоторые ошибки после отправки формы. У меня есть 2 сомнения, поиск которых на этом сайте не получил четкого ответа. Надеюсь, вы могли бы дать мне больше ясности.

1.In users.js, в строке 32 он говорит profileimage в undefined, в то время как у меня есть поле файла с именем profileimage.

2.Если эта строка изменена на req.body.profileimage, это не приведет к ошибке, но я думаю, что это все еще неправильно. При отправке формы, nodeJS бросает ошибку

Ошибка «Не удается установить заголовки после того, как они отправляются»

Я пытался читать другие подобные вопросы, но я не мог связать это с моей программой (Потому что Я не задавал никаких заголовков в своей программе явно). Пожалуйста, дайте более глубокое понимание этих двух проблем.

var express = require('express'); 
var router = express.Router(); 


//var User = require('../models/user'); 
/* GET users listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

router.get('/register', function(req, res, next) { 
    res.render('register', { 
     'title': "Register" 
    }); 
}); 

router.get('/login', function(req, res, next) { 
    res.render('login', { 
     'title': "Login" 
    }); 
}); 

router.post('/register', function(req, res, next) { 
    //Get form values 
    var name = req.body.name; 
    var email = req.body.email; 
    var password = req.body.password; 
    var cpassword = req.body.cpassword; 


    //Check for image field 
    if(req.files.profileimage) { 
     console.log('Uploading File...'); 

     //File Info 
     var profileImageOriginalName = req.files.profileimage.originalname; 
     var profileImageName = req.files.profileimage.name; 
     var profileImageMime = req.files.profileimage.mimetype; 
     var profileImagePath = req.files.profileimage.path; 
     var profileImageExt = req.files.profileimage.extension; 
     var profileImageSize = req.files.profileimage.size; 

    } 
    else { 
     var profileImageName = 'default.png'; 
    } 

    //form validation 
    req.checkBody('name','Name field is required').notEmpty(); 
    req.checkBody('email','Email field is required').notEmpty(); 
    req.checkBody('email','Enter a valid Email').isEmail(); 
    req.checkBody('password','Password field is required').notEmpty(); 
    req.checkBody('cpassword','Passwords fields do not match').equals(req.body.password); 

    var errors = req.validationErrors(); 

    if(errors) { 
     res.render('register', { 
      errors: errors, 
      name: name, 
      email: email, 
      password: password 
     }); 
    } 
    else { 
     var newUser = new User({ 
      name: name, 
      email: email, 
      password: password, 
      profileImage: profileImageName 
     }); 
    } 

*/ 
    //Success Message 
    req.flash('success','You are now registered and may log in'); 

    res.location('/'); 
    res.redirect('/'); 

}); 

module.exports = router; 

register.jade

extends layout 

block content 
    ul.errors 
    if errors 
     each error, i in errors 
     li.alert.alert-danger #{error.msg} 
    form.form-signin(method='post',action='/users/register',enctype='multipart/form-data') 
     h2.form-signin-heading.text-center Register 
     label.sr-only(for='inputName') Name 
     input#inputName.form-control(name='name' type='text', placeholder='Name', autofocus='') 
     label.sr-only(for='inputEmail') Email address 
     input#inputEmail.form-control(name='email' type='email', placeholder='Email address') 
     label.sr-only(for='inputPassword') Password 
     input#inputPassword.form-control(name='password' type='password', placeholder='Password') 
     label.sr-only(for='inputCPassword') Confirm Password 
     input#inputCPassword.form-control(name='cpassword' type='password', placeholder='Confirm Password') 
     label.sr-only(for='inputProfile') Profile Image 
     input#inputProfile.form-control(name='profileimage' type='file') 
     button.btn.btn-lg.btn-primary.btn-block(type='submit') Register 

Более подробный отчет об ошибке

POST /users/register 500 91.651 ms - 2704<br> 
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11) 
    at ServerResponse.header (C:\Dev\nodeauth\node_modules\express\lib\response. 
js:718:10) 
    at ServerResponse.send (C:\Dev\nodeauth\node_modules\express\lib\response.js 
:163:12) 
    at done (C:\Dev\nodeauth\node_modules\express\lib\response.js:957:10) 
    at Object.exports.renderFile (C:\Dev\nodeauth\node_modules\jade\lib\index.js 
:374:12) 
    at View.exports.__express [as engine] (C:\Dev\nodeauth\node_modules\jade\lib 
\index.js:417:11) 
    at View.render (C:\Dev\nodeauth\node_modules\express\lib\view.js:126:8) 
    at tryRender (C:\Dev\nodeauth\node_modules\express\lib\application.js:639:10 
) 
    at EventEmitter.render (C:\Dev\nodeauth\node_modules\express\lib\application 
.js:591:3) 
    at ServerResponse.render (C:\Dev\nodeauth\node_modules\express\lib\response. 
js:961:7) 
    at C:\Dev\nodeauth\app.js:104:7 
    at Layer.handle_error (C:\Dev\nodeauth\node_modules\express\lib\router\layer 
.js:71:5) 
    at trim_prefix (C:\Dev\nodeauth\node_modules\express\lib\router\index.js:310 
:13) 
    at C:\Dev\nodeauth\node_modules\express\lib\router\index.js:280:7 
    at Function.process_params (C:\Dev\nodeauth\node_modules\express\lib\router\ 
index.js:330:12) 
    at IncomingMessage.next (C:\Dev\nodeauth\node_modules\express\lib\router\ind 
ex.js:271:10) 
    at done (C:\Dev\nodeauth\node_modules\express\lib\response.js:956:25) 
    at tryRender (C:\Dev\nodeauth\node_modules\express\lib\application.js:641:5) 

    at EventEmitter.render (C:\Dev\nodeauth\node_modules\express\lib\application 
.js:591:3) 
    at ServerResponse.render (C:\Dev\nodeauth\node_modules\express\lib\response. 
js:961:7) 
    at C:\Dev\nodeauth\app.js:93:9 
    at Layer.handle_error (C:\Dev\nodeauth\node_modules\express\lib\router\layer 
.js:71:5) 
+2

Вы можете найти решение здесь -http: //stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they-are-sent – Ahtisham

+0

Я не вижу, как это Соответствующий. Потому что я не вызывал никакой функции после res.sendRedirect. Что может вызвать ошибку после перенаправления? Я последовал за учебником по строкам. Должен ли я учитывать обновление узла? – Sammy

+0

Где вы импортируете маршрутизатор? Какой-то «app.js' /' server.js », где вы создаете экспресс-приложение? Возможно, объект запроса изменен там, прежде чем передавать его маршрутизатору. – Scarysize

ответ

2

Вы должны переместить этот код:

//Success Message 
req.flash('success','You are now registered and may log in'); 

res.location('/'); 
res.redirect('/'); 

Это должно быть внутри условной:

else { 
     var newUser = new User({ 
      name: name, 
      email: email, 
      password: password, 
      profileImage: profileImageName 
     }); 
     //Success Message 
     req.flash('success','You are now registered and may log in'); 

     res.location('/'); 
     res.redirect('/'); 
    } 

Что произойдет, если вы имеете его снаружи, и вы получите ошибку это. Сначала ваши Условный оператор пожары:

if(errors) { 
    res.render('register', { 
     errors: errors, 
     name: name, 
     email: email, 
     password: password 
    }); 
} 

Когда res.render называется реакция заканчивается, и заголовки отправляются. Однако: поскольку у вас есть res.redirect и res.location за пределами условного экспресс пытается запустить это тоже. Вот почему вы получаете сообщение об ошибке.

Также, как указано в комментарии к вашему вопросу, вы можете узнать больше here.

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