我有一个使用node.js运行的网站,其后端在Firebase Functions上运行。我想将一堆JSON存储到Firebase Storage。当我在localhost上运行时,以下代码片段可以正常工作,但是当我将其上传到Firebase函数时,它表示Error: EROFS: read-only file system, open 'export-stock-trades.json
。有人知道如何解决这个问题吗?
fs.writeFile(fileNameToReadWrite, JSON.stringify(jsonObjToUploadAsFile), function(err){
bucket.upload(fileNameToReadWrite, {
destination: destinationPath,
});
res.send({success: true});
});
我不确定,因为您的函数的大部分上下文都丢失了,但是看起来您的函数正在尝试先将文件写入本地磁盘(fs.writeFile
),然后再上载文件(bucket.upload
)。
在云功能上,您编写的代码仅具有对/ tmp的写权限,这是节点中的
os.tmpdir()
。阅读更多有关documentation:文件系统的唯一可写部分是/ tmp目录,该目录您可以用来在函数实例中存储临时文件。这是一个本地磁盘安装点,称为“ tmpfs”卷,在其中写入数据将该卷存储在内存中。请注意,它将消耗内存为该功能提供的资源。
这可能是导致代码失败的原因。
顺便说一句,如果您要上传的数据在内存中,则无需像现在这样先将其写入文件。您可以改为使用file.save()。
我认为这可行的另一种方法是将JSON文件转换为缓冲区,然后执行类似的操作(下面的代码段)。我写了一篇文章,介绍如何使用Google Cloud Storage进行此操作,但它在Firebase存储中工作正常。您唯一需要更改的是“ service-account-key.json”文件。
文章的链接可以在这里找到:Link to article on medium
const util = require('util')
const gc = require('./config/')
const bucket = gc.bucket('all-mighti') // should be your bucket name
/**
*
* @param { File } object file object that will be uploaded
* @description - This function does the following
* - It uploads a file to the image bucket on Google Cloud
* - It accepts an object as an argument with the
* "originalname" and "buffer" as keys
*/
export const uploadImage = (file) => new Promise((resolve, reject) => {
const { originalname, buffer } = file
const blob = bucket.file(originalname.replace(/ /g, "_"))
const blobStream = blob.createWriteStream({
resumable: false
})
blobStream.on('finish', () => {
const publicUrl = format(
`https://storage.googleapis.com/${bucket.name}/${blob.name}`
)
resolve(publicUrl)
})
.on('error', () => {
reject(`Unable to upload image, something went wrong`)
})
.end(buffer)
})