无法使用Node.js和Express框架读取post参数

Ton*_*ony 2 node.js express

我有一个带有快速框架的node.js服务器.

var express = require('express');
var http = require('http');
var api_helper = require('./helpers/api_helper');
var app = express();

app.use(app.router);
app.use(express.bodyParser());
app.set('port', process.env.PORT || 8081);

app.post('/api/nodev1/users/login', function(req, res){
  var email = req.param('email', null);
  var password = req.param('password', null);
  console.log(email);console.log(password);
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
Run Code Online (Sandbox Code Playgroud)

当我尝试向/ api/nodev1/users/login发布请求时,我无法读取参数.我正在尝试卷曲如下:

curl -d "email=user@example2.com" -d "password=mypassword" http://localhost:8081/api/nodev1/users/login
Run Code Online (Sandbox Code Playgroud)

电子邮件和密码未定义.

hgo*_*ebl 7

你必须app.use(app.router)向下移动app.use(express.bodyParser()).app.router只是一个处理你的路线的阶段的钩子.如果它在bodyParser身体未被解析之前出现.

您的代码可能看起来像这样(如果我无法解释可解释的话):

var app = express();

app.use(express.bodyParser());
app.set('port', process.env.PORT || 8081);

app.use(app.router);

// I added following line so you can better see what happens
app.use(express.logger('dev'));

app.post('/api/nodev1/users/login', function(req, res){ ... }
Run Code Online (Sandbox Code Playgroud)

Offtopic注释:express.bodyParser()只应在文件上传时使用.然后你必须要注意删除临时文件.如果您没有文件上传,那么您最好只使用

app.use(express.json());
app.use(express.urlencoded());
Run Code Online (Sandbox Code Playgroud)

我只是想在你不知道的情况下添加它.我遇到了问题,因为我不知道......

编辑Express 4

感谢@ jonathan-ong,app.use(app.router)Express 4 之后就没有了:

所有路由方法都将按其出现的顺序添加.你不应该这样app.use(app.router).这消除了Express最常见的问题.

换句话说,混合app.use()并将完全按照它们被调用的顺序app[VERB]()工作.

阅读更多:4.x中的新功能.