我正在使用在Netlify功能上部署的node / express / mongoDB构建REST API(该数据库直接来自MongoDB Atlas)。我想做的是创建一个API路由,该路由允许将图像作为POST请求中的字段之一上传。 Express会将该文件上传到Google Cloud Storage,获取新上传的图片网址,并将该网址存储为数据库中的文档字段之一。
我想到的一种选择是使用multer
。由于Express被部署为无服务器功能,因此它无权访问任何存储。这意味着我无法使用multer
在本地存储图像,并且将其保存在内存中会引起太多潜在的问题(图像是视频游戏的屏幕截图,因此非常大)。现在,这是一个不可行的选择,或者至少不是我的理想选择。
我认为最理想的方法是通过API路由处理直接将此文件直接上传到Google Cloud Storage。 This was achieved by Ben Awad,但我几乎不了解他的代码(resolvers
?express.static()
?Mutation
?)。几乎是我每行都要拔头发。
我不知道如何在没有multer
的情况下访问从POST请求上传的文件,更不用说直接将其上传到GCS了。
我应该如何处理呢?
答案 0 :(得分:1)
也许NodeJS GCP storage client可以帮助
在Github自述文件页面中,有一些示例说明如何处理节点和GCP存储。
Here,您可以找到以下上传示例
function main(bucketName = 'my-bucket', filename = './local/path/to/file.txt') {
// [START storage_upload_file]
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'Local file to upload, e.g. ./local/path/to/file.txt';
// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
async function uploadFile() {
// Uploads a local file to the bucket
await storage.bucket(bucketName).upload(filename, {
// Support for HTTP requests made with `Accept-Encoding: gzip`
gzip: true,
// By setting the option `destination`, you can change the name of the
// object you are uploading to a bucket.
metadata: {
// Enable long-lived HTTP caching headers
// Use only if the contents of the file will never change
// (If the contents will change, use cacheControl: 'no-cache')
cacheControl: 'public, max-age=31536000',
},
});
console.log(`${filename} uploaded to ${bucketName}.`);
}
uploadFile().catch(console.error);
// [END storage_upload_file]
}
main(...process.argv.slice(2));