使用formidable模块包装POST请求

准备

使用 $npm install [email protected] 进行安装之前版本,本篇在此基础上使得POST请求的文件数据处理结果类似GET请求。

添加formidable依赖

修改package.json文件添加formidable依赖。由于之前版本忘记添加underscore依赖,本次加上结果如下:

"dependencies": {
    "mime": "1.2.11",
    "underscore": "1.7.0",
    "formidable": ">=1.0.15"
},

npm install

安装formidable。

主流程添加入口

if( req.method === "POST" ){    // POST请求
    rs.on("end",function(){
        require("./lib/post").execute(str, root, req, resp);
    });
}

将resp传递进去以备操作输出给客户端。

创建formidable对象并且解析request

var form = new formidable.IncomingForm(),
    files = [],
    fields = {};
form.uploadDir = req.data.uploadUrl 
    ? ( root + "/" + req.data.uploadUrl + "/" ) 
    : path.join( __dirname + "/tmpl/" ); //上传路径没有传递的时候, 默认
form.parse(req);

在解析事件中添加字段和文件

如果是空文件,不保存

form.on('field', function(field, value) { //处理字段
    fields[field] = value;
}).on('file', function(field, file) {   //处理文本
    if( file.size ){
        files.push({name: field, file: file});
    }
})

解析完成时:

对上传文件进行重命名,同时POST数据结果绑定在request上。

form.on('end', function() {   //字段和文本都保存结束后
    files.map(function(file){
        fs.rename(file.file.path, form.uploadDir + file.file.name, function (err) {
            if(err){ throw err; }
        });
    });
    req.post = fields; //字段保存在request.post上, 可以在模板页面使用
    req.files = files; //文件基本信息也保存在request.files上
    resp.end( _.template(str)({require: require,request:req,response:resp}) ); 
});

测试Demo

表单提交


目标代码 example/post.json

<%=JSON.stringify({
    get: request.data,
    post: request.post,
    files: request.files
})%>

结果

使用formidable模块包装POST请求_第1张图片
post.png

PS:

相关完整代码已经发布到了npm仓库中, 可以使用 $npm install [email protected] 进行安装或者更新。进入目录后使用 $node http-f2e-server.js 启动服务,并查看Demo。

你可能感兴趣的:(使用formidable模块包装POST请求)