在 nodejs 控制器中使用 promises
Working with promises inside nodejs controller
我有以下情况;
- 用户请求将文件附加到项目
- Ctrl 首先查看用户是否有权访问该项目
- 如果用户有访问权限,则允许上传和附加文件
- 如果上传出现问题,则 return 找到的错误
代码
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 可能 return 出错。如果此方法 return 出错,则捕获 return 正确的错误,但在日志中我看到以下内容:
[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
您遗漏了一些 returns
在这种情况下,预期 return 承诺的函数不会这样做:
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。
我有以下情况;
- 用户请求将文件附加到项目
- Ctrl 首先查看用户是否有权访问该项目
- 如果用户有访问权限,则允许上传和附加文件
- 如果上传出现问题,则 return 找到的错误
代码
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 可能 return 出错。如果此方法 return 出错,则捕获 return 正确的错误,但在日志中我看到以下内容:
[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
您遗漏了一些 returns
在这种情况下,预期 return 承诺的函数不会这样做:
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。