我有一个IOS反应原生应用程序,使用Node.js程序下载照片从谷歌云桶。我可以从特定的文件夹中获取照片,但我无法将它们发送回客户。下面是客户端Node.js程序:
index.js
const express = require('express')
const bodyParser = require('body-parser')
const multer = require('multer')
const uploadImage = require('./helpers/helpers')
const downloadImage = require('./helpers/downloadhelpers');
const app = express()
const multerMid = multer({
storage: multer.memoryStorage(),
limits: {
// no larger than 5mb.
fileSize: 25 * 1024 * 1024,
//fileSize: maxSize
},
})
app.disable('x-powered-by')
app.use(multerMid.single('file'))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: false
}))
app.post('/uploads', async (req, res, next) => {
try {
const myFile = req.file
const destination = req.body.folder_name;
const imageUrl = await uploadImage(myFile, destination)
res
.status(200)
.json({
message: "Upload was successful",
data: imageUrl
})
} catch (error) {
next(error)
}
})
app.get('/file_download', async (req, res, next) => {
const folder_name = req.body.folder_name;
try {
const ImageDownload = await downloadImage(folder_name)
console.log(ImageDownload);
res
.status(200)
.json({
message: "Download Successful",
data: ImageDownload
})
} catch (error) {
next(error)
}
})
app.use((err, req, res, next) => {
res.status(500).json({
error: err,
message: 'Internal server error!',
})
next()
})
app.listen(9001, () => {
console.log('app now listening for requests!!!')
})下面是upload节点,它可以很好地工作:
helpers.js
const util = require('util');
const gc = require('./../config')
const bucket = gc.bucket('jtg_app_bucket') // should be your bucket name
module.exports = uploadImage = (File, destination) => new Promise((resolve, reject) => {
const {
originalname,
buffer
} = File
const folder_name = destination;
console.log(folder_name);
const blob = bucket.file(destination + '/' + originalname.replace(/ /g, "_"))
const blobStream = blob.createWriteStream({
resumable: false
})
blobStream.on('finish', () => {
const publicUrl = util.format(
`https://storage.googleapis.com/${bucket.name}/${folder_name.name}/${blob.name}`
)
resolve(publicUrl)
})
.on('error', () => {
reject(`Unable to upload image, something went wrong`)
})
.end(buffer)
})下图是从GCP bucket拉取后发送数据的下载节点:
downloadhelpers.js
module.exports = downloadImage = (FolderToDisplay) => new Promise((resolve, reject) => {
const folder_name = FolderToDisplay;
const {
Storage
} = require('@google-cloud/storage');
var projectId = '*****************' // Your Google Cloud Platform project ID
var keyFilename = './../UploadPhotosNode/config/keys.json'
const storage = new Storage({
keyFilename,
projectId
});
var bucket = storage.bucket("gs://jtg_app_bucket");
const bucketName = 'jtg_app_bucket';
// The directory prefix to search for
const prefix = folder_name + '/';
// The delimiter to use
const delimiter = '/';
const options = {
prefix: prefix,
};
bucket.getFiles(options).then(results => {
const files = results[0];
var resData = {
success: true,
images: {
results: []
}
};
files.forEach(file => {
resData.images.results.push({
uri: 'https://storage.googleapis.com/' + bucketName + '/' +
file.name
});
})
var stringified = JSON.stringify(resData);
var only_images = JSON.parse(stringified);
const data = only_images.images.results;
console.log(data);
resolve(data)
})
.on('error', () => {
reject(`Unable to download images, something went wrong`)
})
.end(buffer)
})下面是我从下载节点程序中获得的数据:
[
{ "uri": "https://storage.googleapis.com/jtg_app_bucket/device_6/image.jpg" },
{ "uri": "https://storage.googleapis.com/jtg_app_bucket/device_6/loved_it.jpg" }
]我需要像在upload node程序中那样使用resolve(数据)发送数据,但我无法做到这一点。有谁能建议如何做到这一点吗?提前谢谢。
我正在控制台中获取const数据中的数据,我想在resolve()中将其发送回index.js中的/file_download。在Postman中,当我运行"http://localhost:9001/file_download",我得到的错误是:
{
"error": {},
"message": "Internal server error!"
}我希望输出结果为
{
"message": "Download Successful",
"data": [
{ "uri": "https://storage.googleapis.com/jtg_app_bucket/device_6/image.jpg" },
{ "uri": "https://storage.googleapis.com/jtg_app_bucket/device_6/loved_it.jpg" }
]
}这样我就可以使用它来显示React Native App中的图像。希望这一点是清楚的。
发布于 2021-12-03 01:51:54
我刚刚从downloadhelpers.js中删除了最后三行,它工作得很好。
下面是正确的下载节点。
downloadhelpers.js
module.exports = downloadImage = (FolderToDisplay) => new
Promise((resolve, reject) => {
const folder_name = FolderToDisplay;
const {Storage} = require('@google-cloud/storage');
var projectId = 'vast-service-281617' // Your Google Cloud Platform
project ID
var keyFilename = './../UploadPhotosNode/config/keys.json'
const storage = new Storage({keyFilename,projectId});
var bucket = storage.bucket("gs://jtg_app_bucket");
const bucketName = 'jtg_app_bucket';
// The directory prefix to search for
const prefix = folder_name+'/';
// The delimiter to use
const delimiter = '/';
const options = {
prefix: prefix,
};
bucket.getFiles(options).then(results => {
const files = results[0];
var resData = {
success: true,
images: {
/* id:[], */
results: []
}
};
files.forEach(file => {
resData.images.results.push({
uri:'https://storage.googleapis.com/'+bucketName+'/' +file.name});
})
var stringified = JSON.stringify(resData);
var only_images = JSON.parse(stringified);
const data = only_images.images.results;
console.log(data);
resolve(data)
})
})以下是Postman的结果:
{
"message": "Download Successful",
"data": [
{
"uri":
"https://storage.googleapis.com/jtg_app_bucket/device_6/image.jpg"
},
{
"uri":
"https://storage.googleapis.com/jtg_app_bucket/device_6/loved_it.png"
}
]
}https://stackoverflow.com/questions/70203442
复制相似问题