我正在尝试编写一些代码,该代码将使用包含诸如google.com
之类的部分URL的字符串,并将其转换为诸如https://google.com
之类的完整URL。
我对Node.js缺乏经验,并且我仍在努力使自己了解异步性。
我正在尝试使用回调而不是诸如promise和async / await之类的回调,并且在我的脑海中,以下代码应该起作用:
exports.rectifyDocumentURLs = function(baseUrl, document, callback) {
callback(null,
document.replace(url_patterns.any, (match) => {
return exports.fixUrl(match, baseUrl, (err, res) => {
if (err) {
callback(err, null)
}
return res
})
})
)
}
url_patterns.any
是一些正则表达式代码,将与任何类型的代码匹配,而函数exports.fixUrl
是将获取部分URL并以完整格式返回的函数。
当我像这样运行代码时
exports.rectifyDocumentURLs("https://google.com", "google.com", (rectifyErr, rectifyRes) => {
console.log(rectifyRes)
})
当前代码仅返回undefined
,但是res
函数的fixUrl
返回正确的结果http://google.com
。
我知道这很像这里的许多问题,但是经过广泛的研究和许多尝试和重写,我相信这可能是修复代码的唯一方法。
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以使用the url module来提供URL解析和解析的实用程序。
const url = require('url');
const myURL = new URL('https://google.com');
console.log(myURL.host); // google.com
答案 1 :(得分:-1)
您的函数rectifyDocumentURLs()
全部搞砸了。
回调的想法是,当某些事情异步发生时,您不知道什么时候完成。因此,您将其传递给一个函数,完成后它将调用传递给您的函数并具有所需的结果。通常,采用回调的函数从不返回有意义的值-将该值传递给回调。在rectifyDocumentURLs()
中,您将立即调用回调,然后使用另一个函数的回调再次调用它,并返回一个(可能是未定义的)值。那只是行不通的。
这是一种更标准的方法:
exports.rectifyDocumentURLs = function(baseUrl, document, callback) {
// it looks like document.replace is async and takes a callback
// when it's done it will pass its result to the callback as match
document.replace(url_patterns.any, (match) => {
// you don't need return the result of a function that takes a callback
// it will pass its result to the callback
exports.fixUrl(match, baseUrl, (err, res) => {
if (err) {
callback(err, null)
} else {
// now that you have res and no error, call the callback
// you passed to rectifyDocumentURLs()
// this value will be the rectifyRes in the function you passed
callback(null, res)
}
})
})
}
当然,正如其他人指出的那样,已经有很多处理URLS的现有代码,但这是一个很好的练习。