此错误一直困扰着我,此代码中有一个(“字符串[]”类型不可分配给“字符串”类型)错误
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`);
}
我真的很困惑如何重新解决这个错误。
答案 0 :(得分:4)
request.query
的类型是 QueryString.ParsedQs
,它来自 qs package。这个包能够读取和解析复杂的查询变量,而不仅仅是“键=值”对。用户可以使用像 ?dataset[]=first&dataset[]=second
这样的 URL 查询,它将被解释为数组 ["first", "second"]
。
您的程序应该如何处理这些输入取决于您。你想处理它们,还是抛出错误?您可以检查 dataset
是否是字符串数组并在每个元素上调用 generateLabel
。但最简单的解决方案是确保 dataset
是 string
,否则返回错误。
请注意,在进入 return
/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
/generateLabel
,因此另一种处理方法是验证 dataset
函数中的 generateLabel
.您将允许函数接受 dataset: any
,但如果 Error
不是 dataset
,则抛出 string
。