使用app.all时,Node.js req.body为空

时间:2013-08-08 21:35:00

标签: node.js express

发布到/ package时遇到问题。这个问题让我疯狂,我对Node&我不知道我在这里做错了什么。

req.body()在执行此操作时为空,除非我删除app.all部分,如果我删除,则会中断强大的上传帖子。

有人能指出我正确的方向吗?为什么我的代码中的app.all部分会破坏我的包裹帖子?

提前非常感谢。真的很感激我能得到的所有帮助。

var express = require('express'),
    routes = require('./routes'),
    http = require('http'),
    fs = require('fs'),
    util = require('util'),
    path = require('path'),
    formidable = require('formidable');

var app = express();

// the code below breaks the package post, but when removed, breaks my upload post.
app.all('/*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'HEAD, GET, POST, PUT, DELETE, OPTIONS');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('uploadFolder', 'uploads');
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session());
    app.use(express.bodyParser());
    app.use(app.router);
});

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

app.post('/upload', function(req, res){
    var form = new formidable.IncomingForm();
    form.maxFieldSize = 1000 * 60 * 60 * 2;
    form.uploadDir = app.get('uploadFolder');
    form.keepExtensions = true;

    form.parse(req, function(error, fields, files) {
        if(error)
            return res.json({"success": false, "error": error});


        res.json({
            "success": true,
            "id": "FILE ID HERE"
        });
    });
});

app.post('/package', function(req, res){
    console.log(req.body);
    res.json({"hello":"world"});
});

http.createServer(app).listen(app.get('port'), function(){
    console.log("Express server listening on port 3000");
});

1 个答案:

答案 0 :(得分:2)

有两种方法可以解决这个问题。首先,更正确的选项是将您的app.all处理程序转换为中间件,而不是app.all('/*', function(req, res, next) {,而是

app.use(function(req, res, next) {

那样next意味着“转到下一个中​​间件”,最终会打到路由器。 app.all通配符路由的问题在于它是路由而不是中间件,因此当您调用next时,意味着“跳过所有其他路由并继续下一个中间件”(这通常是结束)中间件链。但是,你实际上可以使它在next('route');处理程序中*而不仅仅是next()而工作。但是使用中间件是更清晰的,因为该代码永远不会发送响应体,中间件而不是路径更有意义。