响应函数将端口替换为未定义

时间:2019-02-26 09:28:29

标签: typescript ionic-framework

我有一个将对象附加到url的方法。我正在使用Ionic和Java作为后端。下面是方法。

public buildUrl(urlDetails:Object, vals:Object):string {
        let baseUrl = urlDetails["url"];
        console.log(baseUrl)
        console.log(vals)
        //replace $(..) with the values from vals
        let keys = vals ? Object.keys(vals) : null
        if(keys && keys.length > 0) {
            return baseUrl.replace(/:(\w+)/g, (_,k) => vals[k]);
        } else {
            return baseUrl;
        }

例如,传递给对象的示例参数如下所示,

urlDetails:http://192.168.0.109:8080/hiya/user/login

vals:{emailid:'test @ test.com,password:'password'}

这里 baseUrl.replace(/:(\ w +)/ g,(_,k)=> vals [k])函数从baseurl中删除“:8080”,结果baseurl将如下图所示

http://192.168.0.109undefined/hiya/user/login

我猜想 baseUrl.replace(/:(\ w +)/ g,(_,k)=> vals [k])

谢谢!

1 个答案:

答案 0 :(得分:2)

您的replace:上的所有内容替换"8080"之后的所有内容(在本例中为k,您的回调以vals的形式收到)用该字符串("8080"命名的属性的对象。您的vals对象没有名称为"8080"的任何属性,因此vals[k]undefined

我想说要怎么做,但是不清楚“将对象附加到URL”的意思以及为什么要指定要替换的端口。

例如,如果您尝试将对象的属性作为查询字符串参数应用于URL,则不会在端口上使用replace。由于您似乎是针对现代环境,因此我可能会遍历Object.entries的结果(如有必要,可以很容易地对其进行填充)并追加到字符串中,以确保使用{{3} }:

function buildUrl(urlDetails, vals) {
    let baseUrl = urlDetails["url"];
    let sep = "?";
    for (const [key, value] of Object.entries(vals)) {
        baseUrl += `${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
        sep = "&";
    }
    return baseUrl;
}
console.log(
    buildUrl(
        {url: "http://192.168.0.109:8080/hiya/user/login"},
        {emailid:'test@test.com',password:'password'}
    )
);

或使用encodeURIComponentmap

function buildUrl(urlDetails, vals) {
    let baseUrl = urlDetails.url;
    const entries = Object.entries(vals);
    if (entries.length) {
        baseUrl += "?" + entries.map(([key, value]) =>
            `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
        ).join("&");
    }
    return baseUrl;
}
console.log(
    buildUrl(
        {url: "http://192.168.0.109:8080/hiya/user/login"},
        {emailid:'test@test.com',password:'password'}
    )
);