gpt4 book ai didi

javascript - 记录到控制台有效,但立即导致 TypeError

转载 作者:行者123 更新时间:2023-11-28 07:37:58 25 4
gpt4 key购买 nike

我一直在使用节点可读性进行一些工作,但我对导致此错误的原因感到困惑。

var url = req.body.url;

// Now have body, let's unfluff
read(url, function(err, data, meta) {
console.log('title:' + data.title);
console.log('typeof: ' + typeof(data.title));
// Create a new article using data from readability
var article = new Article({
title: data.title,
raw: data.content,
image: data.document.getElementsByTagName('meta')['og:image'].getAttribute('content'), // Could be improved

source: url // Should strip to just domain?
});

console.log(article);

// Close article to clean up jsdom and prevent leaks
//data.close();

// Save article
article.save(function(err) {
if (err) return next(err);
res.redirect('/');
});
});

当使用测试 URL 运行时,以下内容将记录到控制台。

title:Gardening: Time to grow potatoes, ask the expert, and jobs for the week
typeof: string

[redacted]/controllers/temp.js:56
console.log('title:' + data.title);
^
TypeError: Cannot read property 'title' of undefined
at [redacted]/controllers/temp.js:56:32
at Object.jsdom.env.done ([redacted]/node_modules/node-readability/src/readability.js:234:18)
at [redacted]/node_modules/node-readability/node_modules/jsdom/lib/jsdom.js:270:18
at process._tickCallback (node.js:442:13)

所以,显然它可以读取标题,因为它打印了标题。由于某种未知原因,它会立即导致 TypeError。 typeof 返回字符串,但在其他返回之前记录整个数据对象:

[...]
content: [Getter],
title: [Getter],
html: [Getter],
document: [Getter],
[...]

很明显它不是标准字符串。然而,根据文档,它不使用任何类型的惰性处理(例如运行 data.title() 来仅处理标题,从而减少大型数据集的负载)。尝试执行此操作会导致类似的错误:

TypeError: Cannot call method 'title' of undefined
at [redacted]/controllers/temp.js:56:22
at Request._callback ([redacted]/node_modules/node-readability/src/readability.js:172:16)
at self.callback ([redacted]/node_modules/node-readability/node_modules/request/request.js:123:22)

最佳答案

TL;DR;

在回调中的某个位置,在 console.log('typeof: ' + typeof(data.title));console.log(article); 之间,正在抛出错误。将回调的该部分包装在 try/catch 中,并将错误记录在 catch 中以查看它是什么。

非 TL;DR;

要了解为什么会发生这种情况,请查看 the readability source code ;

try {
var readability = new Readability(window, options);

// add meta information to callback
callback(null, readability, meta);
} catch (ex) {
window.close();
return callback(ex);
}

在您的情况下,可读性已成功完成,并且 is invoking your callback, passing null, readability, meta as the parameters 。但是,您的回调随后会引发异常,该异常被可读性源代码中的 catch 捕获。

您的回调将是 called again by readability ,但这次仅传递 ex 这次您的回调尝试调用data.title,,但data未定义,导致另一个异常,< em>不在 try/catch 内,这会导致异常终止您的程序。

这是可读性开发人员的疏忽;他们不应该从 try/catch 中调用您的回调。它应该看起来像这样;

var readability;

try {
readability = new Readability(window, options);
} catch (ex) {
window.close();
return callback(ex);
}

callback(null, readability, meta);

关于javascript - 记录到控制台有效,但立即导致 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28394385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com