2013-03-10 51 views
4

我有一个简单的表单,它使用Express将POST数据发送到Node.JS服务器。这是以下形式:用Express表单接收req.body与邮件表单node.js

<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窗口小部件和输入相关型号与typehead,从Twitter自动完成库。 这是我如何处理在服务器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输入有关的问题。这个问题的任何解决方案...?

谢谢先进!

+0

我想补充控制台检查到处检查什么'req.body'被输出为好,如果'req.body'是空的那么我会看看你传递给/ sendmessage的方式有什么问题 – germainelol 2013-03-10 13:28:25

+0

尝试在输入字段中添加一个名称=“搜索”属性。 – JohnnyHK 2013-03-10 14:12:13

回答

18

req.body由名称和值。

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

你也必须使用快递/ connect.bodyParser()中间件,感谢尼克Mitchinson!

+2

此外,我会确保您使用了Express/Connect bodyParser。如果不是,Express不会填充req.body对象。 – 2013-03-10 18:25:53

+1

我为什么要敲我的头,我的request.body是空的,然后意识到,我的输入应该有名字。经典傻瓜:D。谢谢.. – 2016-03-25 17:41:51

10

我有这个问题,原来我是用app.use(express.bodyParser());,但它是我用的代码之后。移动它解决了这个问题。

+6

非常重要的答案 - Express对app.use()配置对象中的任何东西的位置都非常挑剔。我遇到了app.use(express.bodyParrser())不起作用的问题,因为我是从外部文件声明我的路由,并在调用app.use(express.bodyParser())之前初始化它们。 – netpoetica 2013-08-03 13:12:14

+2

谢谢,这是正是我的问题:) – alvarodms 2016-03-15 13:32:58

0

在我来说,它是由我的应用程序重定向到http造成https。 正在更新Facebook使用https uri修复了它。

6

表达4将是这一个。 (请注意,这不会解析多部分/上传)。

app.use(bodyParser.urlencoded({extended: true})); 

,如果你想获得JSON输入

app.use(bodyParser.json());