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

时间:2021-01-15 15:41:32

标签: node.js string typescript visual-studio-code

此错误一直困扰着我,此代码中有一个(“字符串[]”类型不可分配给“字符串”类型)错误

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`);
  }


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

1 个答案:

答案 0 :(得分:4)

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

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

请注意,在进入 return/else 块之前您需要某种 trycatch,这样您就不会调用 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/generateLabel,因此另一种处理方法是验证 dataset 函数中的 generateLabel .您将允许函数接受 dataset: any,但如果 Error 不是 dataset,则抛出 string