PromisifyAll - 回调不是一个功能

时间:2017-06-22 12:15:51

标签: javascript node.js express bluebird

要么我误解了BlueBird及其宣传的东西是如何运作的,或者我在这里做错了什么。我有一个"上传处理程序"它导出一个函数。此函数具有回调

upload-handler看起来像这样(简化):

function processSourceStrings(fileInformation, callback) {
    var filePath = fileInformation.path
    var fileExtension = path.extname(filePath)
    switch(fileExtension) {
        case '.json':
            processFile(filePath, function(err, result) {
                if(err)
                    callback(err)

                callback(null, result)
            })

        case '.pot':
        case '.po':
            processFile(err, result) {
                if(err)
                    callback(err)

                callback(null, result)
            })
    }
}

module.exports = {
    processSourceStrings: processSourceStrings
}

在我的路由器中,我像这样宣传处理程序:

const uploadHandler = Promise.promisifyAll(require('./process-uploads/upload-handler'))

当在运行时调用该函数时(处理文件时),它会在callback(err)行引发异常,该行说明:

  

TypeError:回调不是函数

这里我从router.js调用该函数:

    for(var i=0; i<req.files["sourceStrings"].length; i++) {
        var fileInformation = req.files["sourceStrings"][i]
        var filePath = fileInformation.path
        var targetFilePath = path.join(targetPath, req.files["sourceStrings"][i].filename)
        fileInformation.path = targetFilePath


        mv(filePath, targetFilePath, {mkdirp: true}).then(uploadHandler.processSourceStrings(fileInformation))
            .then(function(result) {
                console.log(result)
            })
            .catch(function(err) {
                next(err)
            })
    }

我做错了什么?

1 个答案:

答案 0 :(得分:2)

uploadHandler.processSourceStrings(fileInformation)是对基于常规回调函数的调用,这需要将回调作为第二个参数。

Promise.promisifyAll

  

通过遍历对象的属性并在对象及其原型链上创建每个函数的异步等价物来宣传整个对象。 promisified方法名称将是以后缀为后缀的原始方法名称(默认为&#34; Async&#34;)

所以你会这样调用promisified版本:

 uploadHandler.processSourceStringsAsync(fileInformation)