【问题标题】:Working with promises inside nodejs controller在 nodejs 控制器中使用 Promise
【发布时间】:2015-02-04 21:10:28
【问题描述】:

我有以下场景;

  1. 用户请求将文件附加到项目中
  2. Ctrl 首先查看用户是否有权访问项目
  3. 如果用户有权访问,则允许上传和附加文件
  4. 如果上传出现问题,则返回发现的错误

代码

                projectService.getProject(ID)
                    .then(function (project) {
                        if (!project) {
                            return commonService.sendResponse(res, 404);
                        }                
                        fileService.handleFileUpload(ID, [].concat(req.files.file))
                            .then(function (files) {
                                return commonService.sendResponse(res, 200, assets);
                            });
                    })
                    .catch(function (err) {
                        return commonService.sendError(res, err);
                    })
                    .finally(function cleanup() {
                        console.log('Fileupload completed');
                    });

注意:快乐路径流可以工作,但是如果不满足某些条件,handleFileUpload 可能会返回错误。如果此方法返回错误,则 catch 返回正确的错误,但在日志中我看到以下内容:

[TypeError: Cannot call method 'then' of undefined]
    12:44:30.815 service [ERROR] Cannot call method 'then' of undefined (TypeError)

它抱怨的行如下:

  .then(function (files) {

handleFileUpload 如下所示:

 var handleFileUpload = function (projectId, fileList) {
    var deferred = Promise.defer();
    var reject = function (err) {
        deferred.reject(err);
    };

    if (!(containsThumb(fileList)){
        return reject(new Error('Missing thumbnail in request'));
    }

     /** some some logic **/
     return deferred.promise;
 };
}
exports.handleFileUpload = handleFileUpload;

一切正常!但无法弄清楚记录异常的问题。

感谢任何帮助。

J

【问题讨论】:

    标签: javascript node.js events error-handling promise


    【解决方案1】:

    您缺少一些 returns 在这种情况下,预期返回承诺的函数不会这样做:

    projectService.getProject(ID)
        .then(function (project) {
            if (!project) {
                return commonService.sendResponse(res, 404);
            }                
            return fileService.handleFileUpload(ID, [].concat(req.files.file))
    //      ^^^^^^ you will want to wait with `.catch` for this
                .then(function (files) {
                    return commonService.sendResponse(res, 200, assets);
                });
        })
        .catch(function (err) {
            return commonService.sendError(res, err);
        })
        .finally(function cleanup() {
            console.log('Fileupload completed');
        });
    
    var handleFileUpload = function (projectId, fileList) {
        var deferred = Promise.defer();
        var reject = function (err) {
            deferred.reject(err);
            return deferred.promise;
    //      ^^^^^^
        };
    
        if (!(containsThumb(fileList)){
            return reject(new Error('Missing thumbnail in request'));
    // this ^^^^^^ method must always return a promise
        }
    
         /** some some logic **/
         return deferred.promise;
     };
    }
    

    哦,请确保第二个函数不使用deferred antipattern

    【讨论】:

    • 我一直在看它,我没有看到它!非常感谢...不得不添加你提到的捕获。无论如何,是否可以通过现有的捕获来处理而不是引入另一个捕获?再次感谢@bergi
    • 我没有提到要添加的任何新内容?我说你必须添加return,这样returned 承诺中的错误将由现有的catch 处理......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2018-06-26
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多