2014-12-01 143 views
2

我不明白为什么req.body是未定义的。它总是访问node.js server'/ formstuff'中的函数,但req.body是未定义的。Node.js,express,html form req.body is undefined

当我看到它发布到cmd的结果时,我在任何地方都看不到我的查询。事实上res.query和res.params是空的。

任何帮助,将不胜感激,谢谢。

快递:

var express = require('express'), 
app = express(); 
var fs = require('fs'); 
var Promise = require('promise'); 



// Handle Get Request 
app.get('/', function(req, res){ 
// get stuff from request 
var index; 

fs.readFile('./form.html', function (err, data) { 
if (err) { 
    throw err; 
} 
    index = data; 

    res.setHeader("Content-Type", "text/html"); 
    res.send(index); 

}); 

}); 


app.post('/formstuff', function(req, res){ 
    console.log(req.body); 

    res.send(); 
}); 

HTML:

<html> 
<head> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<style type = "text/css"> 

body 
{ 
    margin:0; 
} 
#head 
{ 
    width:100%; 
    color:#FAFAFA; 
    height:170px; 
    text-shadow: 2px 2px 0px rgba(150, 150, 150, 1); 
    background: #39d800; /* Old browsers */ 
    background: -moz-linear-gradient(top, #39d800 0%, #00a008 100%); /* FF3.6+ */ 
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#39d800), color-stop(100%,#00a008)); /* Chrome,Safari4+ */ 
    background: -webkit-linear-gradient(top, #39d800 0%,#00a008 100%); /* Chrome10+,Safari5.1+ */ 
    background: -o-linear-gradient(top, #39d800 0%,#00a008 100%); /* Opera 11.10+ */ 
     background: -ms-linear-gradient(top, #39d800 0%,#00a008 100%); /* IE10+ */ 
    background: linear-gradient(to bottom, #39d800 0%,#00a008 100%); /* W3C */ 
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#39d800', endColorstr='#00a008',GradientType=0); /* IE6-9 */ 
    font-family: Brush Script MT; 
    font-weight:bold; 
    font-size:8.5em; 
    text-align:center; 
} 

form div 
{ 
    padding:0.8%; 
} 
fieldset 
{ 
    font-size: 2em; 
    position:relative; 
} 
input 
{ 
    width: 150px; 
    height: 50px; 
    font-size: 1.2em; 
    clear:both; 
} 
</style> 
</head> 
<body> 

<div id = "head">Notifye</div><br> 

<br> 

<fieldset> 
    <legend>Search</legend> 

     <form name = "form" method = "post" action = "http://127.0.0.1:3000/formstuff"> 

     <input type="text" required = "required" name = "tag" placeholder = "lolcats"> 
     <div><input type = "submit" name = "submit" value = "Submit" id = "sub"></div> 

    </form> 

</fieldset> 

</body> 

回答

2

你错过体解析中间件。

如果您没有上传文件,您可以只需npm install body-parser,然后在您的任何路线之前添加app.use(require('body-parser').urlencoded());

+0

安装之后,它会引发错误,指出它无法找到模块的“body-parser”。我检查了它,并且在我安装它之后它确实存在于节点模块文件夹中。 – 2014-12-01 21:46:18

+0

适用于各种版本的Express(例如3.x以上)。确保你在这里找到的例子如下:https://github.com/expressjs/body-parser – martenc 2014-12-01 22:04:55

0

你需要更多的软件包。我建议:

var connect =require('connect'); // 
var multer  =require('multer'); // This is used when multipart/form-data are required 
app.use(connect.json()); // for json 
app.use(connect.urlencoded()); // for application/x-www-form-urlencoded 
app.use(multer({ dest: './uploads/'}));// for multipart/form-data 

这是最好body-parser作为解释here这是不是安全的。请参阅connect docsmulter docs

+0

作为不使用'body-parser'的理由不再有效。该链接描述了与Express捆绑在一起的Express ** 3 **'bodyParser'中间件,*这两个* urlencoded *和* multipart。 Express ** 4 **独立的'body-parser'模块不会执行多部分,只有urlencoded和JSON。 – mscdex 2014-12-01 23:23:51