javascript - 在 Nodejs Controller 内使用 Promise

标签 javascript node.js events error-handling promise

我有以下场景;

  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

最佳答案

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

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 .

关于javascript - 在 Nodejs Controller 内使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28322079/

相关文章:

javascript - 如何清除触摸屏 "touched"按钮焦点、事件、悬停

javascript - 更改相对于旧行高值的行高属性

javascript - 如何重置 Backbone 中的所有事件

Angular2 从键盘事件中捕获删除按钮按下

javascript - highcharts 图表中的导航器不起作用

Javascript 过滤方法不适用于 if 和 else if

javascript - REST 连接/资源检索混合。使用哪个 Controller ?

javascript - 如何将 Node js native 模块注入(inject) puppeteer 页面

javascript - 当http请求发送时,如何在react js中显示错误消息?

c# - 如何检测表单何时被拖动?