所以我正在用TypeScript编写一个搜索引擎。我有这个错误,就像它告诉我index.domains[host]是未定义的一样。但是当我在vscode中调试时,它说一切都正常,并且defaultMeta 在列表中的每个域上都存在。错误发生在search.ts的第27行。
我对TS很陌生,今年2月开始。
我所犯的错误:
TypeError: Cannot read property 'defaultMeta' of undefined
at C:\none of ur business\search-engine\search\src\apis\search.js:21:49
at Array.map (<anonymous>)
at default_1 (C:\none of ur business\search-engine\search\src\apis\search.js:18:27)
at Layer.handle [as handle_request] (C:\none of ur business\search-engine\search\node_modules\express\lib\router\layer.js:95:5)
at next (C:\none of ur business\search-engine\search\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\none of ur business\search-engine\search\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\none of ur business\search-engine\search\node_modules\express\lib\router\layer.js:95:5)
at C:\none of ur business\search-engine\search\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\none of ur business\search-engine\search\node_modules\express\lib\router\index.js:335:12)
at next (C:\none of ur business\search-engine\search\node_modules\express\lib\router\index.js:275:10)search.ts:
import { readFileSync } from "fs";
import { filePaths } from "../../../config.json";
export default function(req, res) {
res.setHeader("Access-Control-Allow-Origin", "*");
if (req.query.q) {
const timeStart = process.hrtime();
const index = JSON.parse(readFileSync(filePaths.indexDb, "utf-8"));
const query = req.query.q.toLowerCase()
.replace(/[^\w\d ]/g, "");
var results = index.crawled.filter(page => {
return page.url.toLowerCase().includes(query) || page.meta.title?.toLowerCase()?.includes(query);
});
const resultsAmount = results.length;
results = results.slice((req.query.pg || 0) * 20, (req.query.pg || 0) * 20 + 20);
results = results.map(page => {
const url = new URL(page.url);
const host = /^(www\.)/.test(url.host) ? url.host.substr(4) : url.host;
const defMeta = index.domains[host].defaultMeta; // here is the error
return {
url: page.url,
title: page.meta.title === undefined ? defMeta.title : page.meta.title,
desc: page.meta.desc === undefined ? defMeta.desc : page.meta.desc
}
});
const timeEnd = process.hrtime(timeStart);
const timeSecs = Math.round((timeEnd[0] * 1e9 + timeEnd[1]) / 1e9 * 100) / 100;
return res.json({
success: true,
resultsAmount,
timeTaken: timeSecs,
results
});
} else {
return res.status(400)
.json({
success: false,
msg: "Invalid query"
});
}
}发布于 2021-05-23 13:35:56
您的错误指出,应该调用defaultMeta的字段并不存在。也就是说,domains[host]不存在于
const defMeta = index.domains[host].defaultMeta; // here is the error这意味着,如果domains[host]不存在,则不能继续要求字段defaultMeta。
您可以通过在有问题的行周围加上一个if条件来做到这一点,该条件检查它是否已定义:
if (index.domains[host] !== undefined) {
const defMeta = index.domains[host].defaultMeta; // here is the error
return {
url: page.url,
title: page.meta.title === undefined ? defMeta.title : page.meta.title,
desc: page.meta.desc === undefined ? defMeta.desc : page.meta.desc
}
}您可以看到我是如何在if语句中包括以下行的。这是因为您在那里使用的是defMeta,如果没有定义index.domains[host],就不会定义它。
或者,您也可以使用可选链式算子 ?.来访问定义好的值。但是在这里,您还必须确保检查将来的用途(请参阅我使用?.的所有地方)。
if (index.domains[host] !== undefined) {
const defMeta = index.domains?.[host]?.defaultMeta; // here is the error
return {
url: page.url,
title: page.meta.title === undefined ? defMeta?.title : page.meta.title,
desc: page.meta.desc === undefined ? defMeta?.desc : page.meta.desc
}
}因此,也许您必须首先分析为什么index.domains[host]是未定义的。这可能是因为您的const host = /^(www\.)/.test(url.host) ? url.host.substr(4) : url.host;行可能有错误?!
https://stackoverflow.com/questions/67658965
复制相似问题