Pass/Return 发生错误时 reject() 中的一个值

Pass/Return a value in reject() when an error occurs

如何在使用 promises 时 return 使用 reject() 的值?

我正在尝试从我的 node.js 代码访问 AWS S3 存储桶。这是我的 code

如果操作成功,我用 s3Info 对象解析承诺。如果出现错误,我想拒绝承诺,再次 returning s3Info 对象,但带有错误消息。发生错误时,我无法获取带有错误消息的 s3Info{}。我怎样才能做到这一点?

我从另一个模块调用它如下-

log.s3 = await pushToS3(bucketName, filename, data)

...其中 log 是一个对象,s3 是它的 属性(也是一个对象)

当我传递正确的参数时,数据被推送到 s3 并且承诺得到解决,我在 log.s3 中得到以下内容-

"s3": { "success": true, "message": { "ETag": "someETag", "VersionId": "someVersionId" } }

但是当我输入错误的参数时,比如 bucketName 不存在,我得到一个错误,我将其添加到 pushToS3 函数中的 s3Info 对象。我只是无法将该对象返回给调用函数。

这是我在出错时所期望的-

{ success: false, message: { AccessDenied: Access Denied at Request.extractError (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\services\s3.js:585:35) at Request.callListeners (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\sequential_executor.js:106:20) at Request.emit (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\sequential_executor.js:78:10) at Request.emit (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\request.js:683:14) at Request.transition (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\request.js:22:10) at AcceptorStateMachine.runTo (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\state_machine.js:14:12) at F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\state_machine.js:26:10 at Request. (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\request.js:38:9) at Request. (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\request.js:685:12) at Request.callListeners (F:\workspace\webScraping\botsWorkingOnKeywords\node_modules\aws-sdk\lib\sequential_executor.js:116:18) message: 'Access Denied', code: 'AccessDenied', region: null, time: 2019-04-16T04:07:30.545Z, requestId: 12345, extendedRequestId: 'NhyakPOYrMZ4RoRrwaqFSXZFx2c2lrb4+x+HzN/oQiL+7+AyG9RnyXA3CLbJfdOj0GZiIUJSB3U=', cfId: undefined, statusCode: 403, retryable: false, retryDelay: 74.88976302089922 } }

在调用函数的代码中,您可以将函数调用包装在 try/catch 语句中。当您在函数中调用 reject() 时,它会抛出错误。您可以捕获该错误并从错误对象获取传递给 reject() 的数据,将其转换并 return 任何合适的

async function main() {
  try {
    // ... do your things
    log.s3 = await pushToS3(bucketName, filename, data)
    return someValue;
  } catch (error) {
    console.log(error);
    return error;
  }
}