快递js身体解析器不工作?

Jes*_*sse 11 forms connect node.js express

我在使用express的节点服务器中有以下内容(截断到重要部分):

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);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个简单的形式,调用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>
Run Code Online (Sandbox Code Playgroud)

但是express.bodyParser似乎没有做任何事情,并且req.body是未定义的.这是console.logs 的输出:

// 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
Run Code Online (Sandbox Code Playgroud)

注意:content-type正确定义application/x-www-form-urlencoded为bodyParser应该正常工作,并且我已经通过在Safari中弹出调试工具并验证表单数据存在来验证它已经过时了.

Rya*_*lds 20

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'));
Run Code Online (Sandbox Code Playgroud)

tl; dr在调用app.configure()和app.listen()之间移动路线.

  • 维塔利,你能提供一个片段来说明你的要求吗?如果Content-Type标头不是'application/json'或'application/x-www-form-urlencoded',则req.body可以是未定义的. (2认同)