是这样的,在react前端部分因为我的表单包含有图片,所以通过了FormData来实现异步上传,在nodejs中间层使用了formidable来解析接收这些数据(这样子做没问题吧?确实也成功的上传了...虽然感觉有点怪怪的)
router.post('/publish', function(req, res, next){
var fields=[];
var files=[];
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.maxFieldsSize = 2 * 1024 * 1024;
form.keepExtensions= true; //保留后缀格式
form.uploadDir = 'public/uploads/';
form
.on('field', function(field,value){
console.log(field,value);
fields.push({field,value});
})
.on('file', function(field,file){
console.log(field,file);
files.push({field,file});
})
.on('end', function(){
console.log('-> upload done');
console.log(fields);
console.log(files);
files.map(function(file){ /*重命名文件*/
fs.rename(file.file.path,form.uploadDir+file.file.name,function(err){
if(err){
throw err;
};
});
});
superagent.post("127.0.0.1:8000/publish")
/*请求头暂不设置,因为不知道是要'multipart/form-data'还是'json'*/
.send({
fields : fields,
files : files
})
.end(function(err,res){
if(err || !res.ok){
console.log(err);
return false;
}
console.log("数据已转发");
});
});
form.parse(req);
res.json({ data : "哦哦,这是来自服务器的数据" });
});
这是我的问题:
1 我们这次项目的架构还有一个python数据层,我需要把这些表单数据传给它,所以我现在有点迷惑了,数据需要在nodejs中间层解析吗?像我现在写的这样?还是说直接把req.body通过superagent转发给Python层就可以了呢?让后台自己去做处理。
2 我的客户端使用的也是superagent,不是jquery的ajax,这样应该不会有什么隐患吧?
3 异步上传表单是不是有点不太必要呢?其实我这么做的目的只是想在上传的过程中提示“正在发布”,上传后提示“发布成功”然后再在客户端做页面跳转。如果很没有必要的话还有什么方式能实现我的需求呢?
异步上传表单是个很常见的需求哇。至于最后还有一个python数据层,我看你这边是通过http交互的,那么在node处不处理都可以(这个看你喜好了,因为不知道你这个中间层的意义,个人觉得,可以在中间层处理校验,授权这些,python就只保存数据了)。
BTW:node和python打交道,可以用性能更高的rpc。异步上传表单是个很常见的需求哇。至于最后还有一个python数据层,