使用Express node.js的post表单时,收到的req.body为空。

6

我有一个简单的表单,它通过POST方式将数据发送到我的Node.JS服务器,使用Express框架。这是表单:

<form method="post" action="/sendmessage">
  <div class="ui-widget">
      <input type="text" id="search" data-provide="typeahead" placeholder="Search..." />
  </div>
  <textarea id="message"></textarea>
</form>

ui-widget 和 input 与 Twitter 的自动完成库 typehead 相关。以下是我在服务器上处理 POST 请求的方式:

app.post('/sendmessage', function (req, res){

  console.log(req.body);

  usermodel.findOne({ user: req.session.user }, function (err, auser){

        if (err) throw err;

        usermodel.findOne({ user: req.body.search }, function (err, user){

            if (err) throw err;

             var message = new messagemodel({

                  fromuser: auser._id,
                  touser: user._id,
                  message: req.body.message,
                  status: false

             });

             message.save(function (err){

                  if (err) throw err;

                  res.redirect('/messages')

             })

        });

   });

});

控制台显示'{}',然后出现带有req.body.search的错误,因为search未定义。我不知道这里发生了什么问题,这与typehead输入无关。有没有解决这个问题的方法...?
提前感谢!

我会在控制台添加检查,以检查 req.body 的输出情况。如果 req.body 为空,则我会查看您传递给 /sendmessage 的内容或方式存在什么问题。 - germainelol
尝试在您的输入字段中添加 name="search" 属性。 - JohnnyHK
5个回答

22

req.body由名称和值组成。

在搜索框中添加name="search",然后再试一次。

还必须使用express/connect.bodyParser()中间件,感谢Nick Mitchinson!


2
此外,我会确保您已经使用了Express/Connect的bodyParser。如果没有,Express将不会填充req.body对象。 - Nick Mitchinson
1
我一直在为请求体为空而苦恼,后来才意识到我的输入应该有名称。典型的傻瓜:D。谢谢。 - Jeremy Rajan

11

我遇到了这个问题,结果发现我使用了 app.use(express.bodyParser());,但是它在我正在使用的代码后面。将其向上移动解决了问题。


7
非常重要的答案 - Express 对 app.use() 配置对象中任何内容的位置非常挑剔。我遇到了一个问题,即在从外部文件声明路由并在调用 app.use(express.bodyParser()) 之前初始化它们时,app.use(express.bodyParrser()) 不起作用。 - netpoetica
2
谢谢,这正是我的问题 :) - alvarodms

6
express 4中,可以使用以下内容(请注意,这不会解析多部分/上传文件)。
app.use(bodyParser.urlencoded({extended: true}));

如果您想接收JSON输入

app.use(bodyParser.json());

0
在我的情况下,这是由于我的应用程序将 http 重定向到 https 导致的。更新 Facebook 使用 https uri 解决了这个问题。

0
在我的情况下,我没有像这样在我的字段中提供名称标签name="firstname"。添加它们后,一切正常运作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接