2016-05-16 60 views
1

我在NodeJS中比較新,我正在學習本教程系列。NodeJS錯誤 - 發送後無法設置標題

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

在這個特定的視頻,我提交表單後得到一些錯誤。我有2個疑問,在這個網站搜索沒有得到明確的答案。我希望你能給我更多的清晰。

1.在users.js中,在第32行中,它表示未定義profileimage,事實上我有一個名爲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語句火災:

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

res.render被稱爲完成的響應和頭被髮送。但是:由於條件Express外部的res.redirectres.location也嘗試運行此操作。這就是爲什麼你會收到錯誤信息。

此外,正如你對你的問題的評論中指出的,你可以閱讀更多here

相關問題