0

我正在使用 Express 构建一个查询 Twitter API v1.1 的搜索引擎应用程序。目前,我正在尝试通过使用 bodyParser 模块解析表单数据来将搜索字符串提交到我的服务器。这是代码:

索引.ejs

...
<form method="GET" action="/results">
    <input id="input" type="text" name="search">
    <button id="searchButton">+</button>
</form>
...

服务器.js

var express = require('express'),
    bodyParser = require('body-parser');

var app = express();

var port = process.env.PORT || 8080;

app.set('view engine', 'ejs');

app.use(express.static(__dirname + "/public");

var urlencodedParser = bodyParser.urlencoded({ extended: false })

app.get('/', function(req, res) {
    res.render('index');
});

app.get('/results', urlencodedParser, function (req, res) {
    console.log(req.body);
    res.render('results')
});

app.listen(port, function() {
    console.log('Our app is running on http://localhost:' + port);
});

显示的代码会将{ }返回到控制台。如果我尝试访问 req.body.search 它返回未定义(显然)。这里有什么问题?为什么它不记录我的搜索字符串?

4

1 回答 1

1

您使用了错误的身体解码器。如果您要提交表单(表单application/x-www-form-urlencoded的默认设置enctype),您将需要bodyParser.urlencoded()而不是bodyParser.text(). 后者用于明文请求数据,而不是表单数据。

此外,您还应该使用method="POST"andPOST路由 ( app.post('/results', ...)) 而不是method="GET"andGET路由。由于GET请求几乎没有正文,因此浏览器将表单数据转换为查询字符串,然后将其附加到 url 本身。这意味着您的表单数据当前位于req.query而不是req.body. 切换到POST虽然会导致浏览器在请求正文中发送表单数据,并且表单数据将按req.body预期进入。

于 2015-10-03T22:49:04.923 回答