Express js body parser не работает? - PullRequest
       5

Express js body parser не работает?

11 голосов
/ 17 сентября 2011

На моем сервере узлов используется следующее выражение (усеченное до важных частей):

var app = express.createServer();

app.all(/test/,function(req,res){
    console.log(req.headers);
    console.log(req.body);
    res.send("");
});

function appStart(cobrands){
    app.configure(function(){
        app.use(express.bodyParser());
        app.use(express.cookieParser());

        app.use('/min',express.static('../min'));
        app.use('/js',express.static('../js'));
        app.use('/css',express.static('../css'));
        app.use('/img',express.static('../img'));
    });
    app.listen(8080);
}

У меня есть простая форма, которая вызывает localhost: 8080, например:

<form action="http://localhost:8080/test" method="post">
    <input type="hidden" name="test" value="testing"/>
    <input type="submit" name="submit" value="to node"/>
</form>

Но express.bodyParser, похоже, ничего не делает, и req.body не определено. Вот вывод console.log s:

// req.headers
{ host: 'localhost:8080',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3',
  'content-length': '27',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  origin: 'file://',
  'content-type': 'application/x-www-form-urlencoded',
  'accept-language': 'en-us',
  'accept-encoding': 'gzip, deflate',
  cookie: '',
  connection: 'keep-alive' }
// req.body
undefined

Примечание: content-type правильно определено как application/x-www-form-urlencoded, как и должно работать для bodyParser, и я убедился, что это происходит, открыв инструменты отладки в Safari и проверив, что данные формы присутствуют.

Ответы [ 2 ]

20 голосов
/ 17 сентября 2011

http://expressjs.com/guide.html#configuration

Обратите внимание на использование app.router, который можно (необязательно) использовать для монтирования маршруты приложений, в противном случае первый вызов app.get (), app.post () и т. д. будут монтировать маршруты.

Что происходит, вы вызываете app.all () перед добавлением любого другого промежуточного программного обеспечения. Благодаря этому app.router становится все остальным промежуточным программным обеспечением, в результате чего они никогда не используются в запросах, которые заканчиваются внутри ваших маршрутов.

Монтирование маршрутов приложения в значительной степени аналогично выполнению app.use(app.router);.

В итоге ваш стек выглядит так:

app.use(app.router); // Contains your /test/ route
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use('/min',express.static('../min'));
app.use('/js',express.static('../js'));
app.use('/css',express.static('../css'));
app.use('/img',express.static('../img'));

tl; dr Переместите свой маршрут между вызовом в app.configure () и app.listen ().

3 голосов
/ 26 сентября 2011

У меня была похожая проблема, и я понял, что это из-за неисправности / отсутствия express.bodyParser ().Вместо bodyParser экспресса я использовал bodyParser коннекта, и он работал как шарм:

app.use(require('connect').bodyParser());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...