nodejs中的end事件上的node-formidable

时间:2014-11-17 07:09:01

标签: node.js file-upload

我正在尝试将流数据写入我的数据库。下面是我的代码,其中输入两个我试图上传的文件。这两个文件都保存在DB中,但在所有数据库操作完成之前,会调用form.on(“end”)事件(第二个DB调用)。

var form = new formidable.IncomingForm();
form.onPart = function (part) {
        // First DB call
        var Obj = {
            'DBName': 'FILEDB',
            'collectionName': 'FILEDATA',
            'fileName': "File1"
        }
        dbapi(part, Obj, function (err, result) {
            if (err)
                console.log(err)
            else {
                console.log(result);
            }
        })
    }
form.on('end', function () {
        // second DB call
    });

如何在完成所有form.onPart()数据库调用之后调用form.on('end')。任何有关这方面的帮助都会非常有用。

1 个答案:

答案 0 :(得分:0)

有助于您了解这两个事件的情况。 ==> dbapi有一个回调函数,它不会在'结束之前返回/结束。 form.on。

触发事件

有很多方法可以满足您的需求,例如:调度form.onPart和form.on以串行方式运行 - 在Node"中检出或google"系列异步控制流模式。如果不使用异步,下面的代码段可以解决您的问题:

var form = new formidable.IncomingForm();
form.onPart = function (part) {
    // First DB call
    var Obj = {
        'DBName': 'FILEDB',
        'collectionName': 'FILEDATA',
        'fileName': "File1"
    };
    dbapi(part, Obj, function (err, result) {
        if (err)
            console.log(err);
        else {
            console.log(result);
        }
        scheduleEndEvent();
    });
};
function scheduleEndEvent() {
form.on('end', function () {
        // second DB call
});
} 

尝试上面看看它是否适合您,但您真正需要的是掌握Node中的控制流模式。

我可以确认async.series是一种优雅的方式,可以按照您描述的顺序链接您正在处理的事件。

参见下面的算法:

async.series([
   function1,
   function2
], callback)