我需要使用AWS SDK判断文件是否存在.以下是我正在做的:

var params = {
    Bucket: config.get('s3bucket'),
    Key: path
};

s3.getSignedUrl('getObject', params, callback);

它可以工作,但问题是当对象不存在时,回调(带有参数err和url)不会返回错误,当我try 访问url时,它会显示"NoSuchObject".

当对象不存在时,这个getSignedUrl方法不应该返回一个错误对象吗?如何确定该对象是否存在?我真的需要在返回的URL上打电话吗?

推荐答案

在创建签名URL之前,需要判断文件是否直接存在于bucket中.一种方法是请求HEAD元数据.

// Using callbacks
s3.headObject(params, function (err, metadata) {  
  if (err && err.name === 'NotFound') {  
    // Handle no object on cloud here  
  } else if (err) {
    // Handle other errors here....
  } else {  
    s3.getSignedUrl('getObject', params, callback);  
    // Do stuff with signedUrl
  }
});

// Using async/await
try {
  await s3.headObject(params).promise();
  const signedUrl = s3.getSignedUrl('getObject', params);
  // Do stuff with signedUrl
} catch (error) {
  if (error.name === 'NotFound') {
    // Handle no object on cloud here...
  } else {
    // Handle other errors here....
  }
}

Node.js相关问答推荐

使用NodeJS在S3上传文件时的格式问题

当建议在第二代上运行云功能时,现在是否有新的Firestore AdminClient可供使用?

为什么我的表单数据在我的POST请求中作为应用程序/json发送,为什么它返回错误请求错误?

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

当变量在另一个文件中初始化时,在初始化错误之前无法访问变量

函数声明中的异步在没有等待的函数中做什么?

如何使用 Remix 仅在客户端呈现组件?

我应该转译我的 TypeScript 应用程序吗?

TypeError:changeChecked 不是函数

响应发送 200 而不是 403

node和mongoDB聚合数据时的输入字段函数

Node js中向rest服务发送https请求的步骤

等价于 Node.js 的 Rails 控制台

Node.js -Firebase 服务帐户私钥不会解析

如何在离线时安装 npm 包?

在单独的模块中定义 Mongoose 模型

Selenium WebDriver 等到元素显示

卸载代码/模块

将 Heroku App 连接到 Atlas MongoDB 云服务

要求('babel/register')不起作用