Node.js, express, html form req.body 未定义

Posted

技术标签:

【中文标题】Node.js, express, html form req.body 未定义【英文标题】:Node.js, express, html form req.body is undefined 【发布时间】:2015-01-30 00:15:02 【问题描述】:

我不明白为什么 req.body 未定义。它总是访问 node.js 服务器 '/formstuff' 中的函数,但 req.body 是未定义的。

当我查看它确实发布到 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>

【问题讨论】:

【参考方案1】:

您缺少正文解析中间件。

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

【讨论】:

安装后会抛出错误,提示找不到模块'body-parser'。我检查了一下,安装后它确实存在于节点模块文件夹中。 适用于我的各种 Express 版本(例如 3.x 以上)。确保您遵循此处找到的示例:github.com/expressjs/body-parser【参考方案2】:

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

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 docs和multer docs

【讨论】:

作为不使用body-parser 的原因给出的链接不再有效。该链接描述了 Express 3 bodyParser 中间件,它与 Express 捆绑在一起,同时进行了 urlencoded multipart。 Express 4 的单独 body-parser 模块不做多部分,只做 urlencoded 和 JSON。

以上是关于Node.js, express, html form req.body 未定义的主要内容,如果未能解决你的问题,请参考以下文章

使用 express.js 在 node.js 中提供 html 的最佳实践是啥?

Node.js, express, html form req.body 未定义

基于node.js的web框架express

node.js + express + socket.io 无法将 javascript 文件加载到 index.html

使用 Node JS / Express 提供包含图像的静态 HTML 页面

Node.js连接Mysql,并把连接集成进Express中间件中