'string | 类型的参数字符串[] |解析Qs |解析Qs[] | undefined' 不能分配给'string' 类型的参数

2024-05-27

这个错误一直困扰着我,此代码中出现 (Type 'string[]' is not allocate to type 'string') 错误

export const generateLabelFile = functions.https.onRequest(
  async (request, response) => {
    const dataset = request.query['dataset'];
    if (!dataset) {
      response.status(404).json({ error: 'Dataset not found' });
    }
    try {
      const labelsFile = await generateLabel(dataset);
                                               ^^^ ERROR ABOVE
      response.json({ success: `File uploaded to ${labelsFile}` });
    } catch (err) {
      response.status(500).json({ error: err.toString() });
    }
  }
);


async function generateLabel(dataset: string): Promise<String> {
  const storage = new Storage({ projectId: PROJECT_ID });
  const prefix = `datasets/${dataset}`;

  // get all images in the dataset
  const [files] = await storage.bucket(AUTOML_BUCKET).getFiles({ prefix });

  const csvRows = files
    .map(file => getMetadata(file.name))
    .filter((metadata): metadata is ImageMetadata => metadata !== null)
    .map(({ label, fullPath }) => `gs://${AUTOML_BUCKET}/${fullPath},${label}`);

  console.log('Total rows in labels.csv:', csvRows.length);

  // No videos found, abort
  if (csvRows.length === 0) {
    throw new Error(`No videos found`);
  }


我真的很困惑如何解决这个错误。


类型为request.query is QueryString.ParsedQs它来自于qs包 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/qs/index.d.ts。该包能够读取和解析复杂的查询变量,而不仅仅是“键=值”对。用户可以使用 URL 查询,例如?dataset[]=first&dataset[]=second,这将被解释为一个数组["first", "second"].

您的程序应如何处理这些输入取决于您。您想处理它们还是抛出错误?你可以检查一下是否dataset是一个字符串数组并调用generateLabel在每个元素上。但最简单的解决方案是确保dataset is a string否则返回错误。

请注意,您需要某种return or else在进入之前try/catch阻止,这样你就不会打电话generateLabel与非字符串。

export const generateLabelFile = functions.https.onRequest(
  async (request, response) => {
    const dataset = request.query['dataset'];
    if (!dataset) {
      response.status(404).json({ error: 'Dataset not found' });
      return;
    }
    if ( typeof dataset !== "string" ) {
      response.status(500).json({ error: 'Invalid dataset' });
      return;
    }
    try {
      const labelsFile = await generateLabel(dataset);
      response.json({ success: `File uploaded to ${labelsFile}` });
    } catch (err) {
      response.status(500).json({ error: err.toString() });
    }
  }
);

处理这个问题的另一种方法,因为您已经在使用try/catch around generateLabel,是为了验证datasetgenerateLabel功能。您将允许该函数接受dataset: any,但抛出一个Error if dataset除了string.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

'string | 类型的参数字符串[] |解析Qs |解析Qs[] | undefined' 不能分配给'string' 类型的参数 的相关文章

随机推荐