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

The*_*tex 0 string node.js typescript visual-studio-code

此错误一直困扰着我,此代码中的 (Type 'string[]' is notassignable 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`);
  }


Run Code Online (Sandbox Code Playgroud)

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

Lin*_*ste 5

for request.queryis的类型QueryString.ParsedQs来自qs 包。这个包能够读取和解析复杂的查询变量,而不仅仅是“键=值”对。用户可以使用类似 的 URL 查询?dataset[]=first&dataset[]=second,它将被解释为一个数组["first", "second"]

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

请注意,在进入/块之前,您需要某种returnelse,以便您不会使用非字符串进行调用。trycatchgenerateLabel

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() });
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

由于您已经在使用try/ catcharound generateLabel,因此另一种处理方法是datasetgenerateLabel函数内验证。您将允许该函数接受dataset: any,但抛出一个Errorifdataset不是string.