首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:无法读取未定义的属性“defaultMeta”

TypeError:无法读取未定义的属性“defaultMeta”
EN

Stack Overflow用户
提问于 2021-05-23 11:00:12
回答 1查看 498关注 0票数 2

所以我正在用TypeScript编写一个搜索引擎。我有这个错误,就像它告诉我index.domains[host]是未定义的一样。但是当我在vscode中调试时,它说一切都正常,并且defaultMeta 在列表中的每个域上都存在。错误发生在search.ts的第27行。

我对TS很陌生,今年2月开始。

我所犯的错误:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-23 13:35:56

您的错误指出,应该调用defaultMeta的字段并不存在。也就是说,domains[host]不存在于

代码语言:javascript
复制
const defMeta = index.domains[host].defaultMeta; // here is the error

这意味着,如果domains[host]不存在,则不能继续要求字段defaultMeta

您可以通过在有问题的行周围加上一个if条件来做到这一点,该条件检查它是否已定义:

代码语言:javascript
复制
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],就不会定义它。

或者,您也可以使用可选链式算子 ?.来访问定义好的值。但是在这里,您还必须确保检查将来的用途(请参阅我使用?.的所有地方)。

代码语言:javascript
复制
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;行可能有错误?!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67658965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档