Node.js Firebase访问的云存储错误“;管理员存储(…).ref不是一个函数;

Node.js Firebase访问的云存储错误“;管理员存储(…).ref不是一个函数;,node.js,firebase,firebase-storage,firebase-admin,Node.js,Firebase,Firebase Storage,Firebase Admin,我正在为Firebase使用云存储,但不知道如何访问存储文件 根据官方指南,此代码应该返回根引用 let admin = require('firebase-admin') admin.initializeApp({...}) let storageRef = admin.storage().ref() 但它抛出了一个错误,即 TypeError:admin.storage(…).ref不是函数 package.json { "name": "functions", "descript

我正在为Firebase使用云存储,但不知道如何访问存储文件

根据官方指南,此代码应该返回根引用

let admin = require('firebase-admin')
admin.initializeApp({...})
let storageRef = admin.storage().ref()
但它抛出了一个错误,即

TypeError:admin.storage(…).ref不是函数

package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {...},
  "dependencies": {
    "@google-cloud/storage": "^1.5.1",
    "firebase": "^4.8.0",
    "firebase-admin": "~5.4.2",
    "firebase-functions": "^0.7.1",
    "pdfkit": "^0.8.3",
    "uuid": "^3.1.0"
  },
  "private": true
}
节点-v=> v7.7.4


我的最终目标是下载文件或上传pdf文件到存储器

您正在使用云函数和Firebase Admin SDK尝试访问您的存储桶。您引用的入门指南是关于客户端Web应用程序的,它使用Firebase的Web API,而不是管理员API。那里的功能不同,因为它使用不同的SDK(即使它们的名称相同)

您试图访问的
存储
对象没有
ref()
函数,只有
app
bucket()

尝试直接使用Google云API:

-

编辑:
这个编辑只是为了停止用两年前的帖子吓唬人。截至2020年5月,上述答案仍然适用。

在下面的示例中,我从名为“图像”的现有Firestore集合中提取图像引用。我正在交叉引用“图片”集合和“帖子”集合,这样我只能得到与某个帖子相关的图片。这不是必需的

以下是重要的部分:

const storageBucket = admin.storage().bucket( 'gs://{YOUR_BUCKET_NAME_HERE}.appspot.com' )
const fileName = "file-name-in-storage" // ie: "your-image.jpg" or "images/your-image.jpg" or "your-pdf.pdf" etc.
const remoteImagePath = storageBucket.file( fileName ).getSignedUrl({
    action: "read",
    expires: '03-17-2025' // this is an arbitrary date
})
.then( data => data[0] )

如果您只是想临时链接到云存储桶中某个文件夹中的所有图像,下面的代码片段将实现这一点。在本例中,我查询文件夹
images/userId
下的所有图像

exports.getImagesInFolder=functions.https.onRequest(异步(req,res)=>{
const storageRef=admin.storage().bucket('gs://{YOUR_bucket_NAME_HERE}');
常量查询={
目录:`images/${req.body.userId}`//查询images/userId下的图像
};
const[files]=wait-storageRef.getFiles(查询)
const url=wait Promise.all(files.map)(file=>file.getSignedUrl({
行动:“阅读”,
expires:'04-05-2042'//这是任意日期
})))
返回res.send({url})
})
API文档:


PS:请记住,这可能会允许任何人传递
用户ID
,并查询此特定用户的所有图像。

是否使用函数?如果是这样,请使用
bucket=admin.storage().bucket()
,函数admin不使用web API感谢您的回复,是的,我可以通过这种方式访问bucket,也可以使用
bucket.file('images/snow.jpg')
访问文件,但我想返回/下载文件以响应云函数。你能指导一下吗?我试过
bucket.file('images/snow.jpg').getDownloadURL()
,但它说
bucket.file(…)。getDownloadURL不是函数,因为它不是。参见可用函数:嘿。。我一直在。。错误:如果没有
客户端电子邮件
,则无法对数据进行签名。我在哪里可以配置客户端电子邮件?这是一个对常见混乱的完美解释。我认为Firebase的文档可能会更好。你简单的回答让我节省了很多时间。谢谢截至2020年3月,这是否仍然正确?如果没有,是否有计划将存储api包括到管理员sdk中?截至2020年4月,仍然如此。Firebase的文档本可以更好地强调这一点。找不到链接,请更新其他链接好吗?
const storageBucket = admin.storage().bucket( 'gs://{YOUR_BUCKET_NAME_HERE}.appspot.com' )
const fileName = "file-name-in-storage" // ie: "your-image.jpg" or "images/your-image.jpg" or "your-pdf.pdf" etc.
const remoteImagePath = storageBucket.file( fileName ).getSignedUrl({
    action: "read",
    expires: '03-17-2025' // this is an arbitrary date
})
.then( data => data[0] )