首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从Node.js发送回客户端

将数据从Node.js发送回客户端
EN

Stack Overflow用户
提问于 2021-12-02 16:48:21
回答 1查看 60关注 0票数 0

我有一个IOS反应原生应用程序,使用Node.js程序下载照片从谷歌云桶。我可以从特定的文件夹中获取照片,但我无法将它们发送回客户。下面是客户端Node.js程序:

index.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
})

下面是我从下载节点程序中获得的数据:

代码语言:javascript
复制
[
  { "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",我得到的错误是:

代码语言:javascript
复制
{
  "error": {},
  "message": "Internal server error!"
}

我希望输出结果为

代码语言:javascript
复制
{
  "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中的图像。希望这一点是清楚的。

EN

回答 1

Stack Overflow用户

发布于 2021-12-03 01:51:54

我刚刚从downloadhelpers.js中删除了最后三行,它工作得很好。

下面是正确的下载节点。

downloadhelpers.js

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
{
"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"
    }
  ]
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70203442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档