【问题标题】:Trigger getSignedUrl function in node back, pass to front在节点后面触发getSignedUrl函数,传递到前面
【发布时间】:2021-06-01 15:55:57
【问题描述】:

TL;DR — 如何从 React 前端在我的节点后端触发 getSignedUrl 函数,并将结果返回到前端?

NTL;RM — 在我的后端 server.js 文件中,以下函数从 gcloud 生成一个签名的 url,但我不确定如何 1)从前端触发该函数,以及 2)将生成的 signedUrl 返回到我将使用它直接从浏览器上传到 gcloud 的前端。

后端:

import express from 'express';
...
app.get('/api/gcloud', () => generateV4UploadSignedUrl().catch(console.error)); // I think this is wrong because the 

async function generateV4UploadSignedUrl() {
  const bucketName = 'my-gloud-bucket';
  const filename = uuidv4();
  const options = {
    version: 'v4',
    action: 'write',
    expires: Date.now() + 15 * 60 * 1000, // 15 minutes
    contentType: 'application/octet-stream',
  };

  // Get a v4 signed URL for uploading file
  const [signedUrl] = await storage
    .bucket(bucketName)
    .file(filename)
    .getSignedUrl(options);
  console.log(signedUrl); // log out fine.
  return signedUrl;
}

前端:

  async function getUploadURL() {
    try {
      const { data } = await fetch('http://localhost:8080/api/gcloud');
      console.log(data.url); // data undefined
      return data.url;
    } catch (error) {
      console.log('error', error);
    }
  }

【问题讨论】:

  • 我从没见过 NTL;RM,那是干什么用的?

标签: node.js reactjs express google-cloud-platform


【解决方案1】:

您的端点目前没有返回任何响应。您可以在 JSON 响应中发送 URL。

app.get('/upload-url', async (req, res) => {
  try {
    const url = await generateV4UploadSignedUrl()
    res.json({ url })
  } catch (err) {
    res.status(500).send({ message: err.message })
  }
}

您现在可以从前端(使用您喜欢的库)发送请求以获取 URL。

一个使用axios的例子:

async function getUploadURL() {
  try {
    const { data } = await axios.get('https://yourdomain.com/upload-url')
    return data.url
  } catch (error) {
    // handle error
  }
}

或者,如果您使用的是fetch

async function getUploadURL() {
  try {
    const response = await fetch('https://yourdomain.com/upload-url')
    const data = await response.json()
    return data.url
  } catch (error) {
    // handle error
  }
}

【讨论】:

  • 谢谢。我在 app.get 的 try 块中得到 res.json is not a function。我尝试在async (res) => 中传递 res 但没有运气。 generateV4UploadSignedUrl() 的值没有返回到前端。
  • @KirkRoss 我的错。刚刚修复了代码以在回调中包含reqres。回调中的第一个参数是request 对象。这就是你的尝试没有成功的原因。
  • 如果我在返回之前控制台data.url(在前端的 axios.get 之后),我得到can't read property url of undefined。即使我console.log(getUploadURL()); 它是未定义的。但是......在后端,正在生成signedURL,我可以将它记录在后端。我正在使用 fetch btw,但我认为这并不重要。
  • @KirkRoss 你能用fetch 代码更新你的问题吗?
  • @KirkRoss 刚刚更新了我的答案以展示如何使用fetch。你可以阅读它here
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2019-10-25
  • 2018-12-06
相关资源
最近更新 更多