【问题标题】:Argument of type 'string | string[] | ParsedQs | ParsedQs[] | undefined' is not assignable to parameter of type 'string''string | 类型的参数字符串[] |解析问题 | ParsedQs[] | undefined' 不能分配给“string”类型的参数
【发布时间】:2021-04-20 15:47:30
【问题描述】:

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


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

【问题讨论】:

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


    【解决方案1】:

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

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

    请注意,在进入try/catch 块之前,您需要某种returnelse,这样您就不会使用非字符串调用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() });
        }
      }
    );
    

    由于您已经在 generateLabel 周围使用了 try/catch,因此处理此问题的另一种方法是在 generateLabel 函数中验证 dataset。您将允许该函数接受dataset: any,但如果dataset 不是string,则抛出Error

    【讨论】:

    • 再次感谢您的宝贵时间。上帝保佑
    猜你喜欢
    • 2021-04-19
    • 2018-04-05
    • 2021-07-02
    • 2021-09-30
    • 2022-08-13
    • 2021-10-02
    • 1970-01-01
    • 2021-09-22
    • 2021-09-06
    相关资源
    最近更新 更多