发布到/ 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");
});
答案 0 :(得分:2)
有两种方法可以解决这个问题。首先,更正确的选项是将您的app.all
处理程序转换为中间件,而不是app.all('/*', function(req, res, next) {
,而是
app.use(function(req, res, next) {
那样next
意味着“转到下一个中间件”,最终会打到路由器。 app.all
通配符路由的问题在于它是路由而不是中间件,因此当您调用next
时,意味着“跳过所有其他路由并继续下一个中间件”(这通常是结束)中间件链。但是,你实际上可以使它在next('route');
处理程序中*
而不仅仅是next()
而工作。但是使用中间件是更清晰的,因为该代码永远不会发送响应体,中间件而不是路径更有意义。