在Node.js函数中使用`replace`

时间:2018-07-08 06:39:56

标签: javascript asynchronous

我正在尝试编写一些代码,该代码将使用包含诸如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

我知道这很像这里的许多问题,但是经过广泛的研究和许多尝试和重写,我相信这可能是修复代码的唯一方法。

任何帮助将不胜感激。

2 个答案:

答案 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的现有代码,但这是一个很好的练习。