2017-04-02 100 views
0

因此,我正在开发自定义分页功能与快递和猫鼬。我有一个称为页面的get参数,我需要更改每个不同页面的值。问题是,我这样做,它不断追加“页面”键值对像这样的网址“& page = 1 & page = 1 & page = 1”。那是因为我不只是更改“页”的价值,但我追加键值对像每一次这样:ExpressJS - 如何更改获取请求的url中的密钥值

currentPageUrl: req.originalUrl + '&page=' + currentPage 

我只需要改变“页”键的值。我怎样才能做到这一点?任何建议,表达帮手功能或定制解决方案都会有很大帮助。提前致谢!

回答

1

如果您知道page=xxx参数是已经在那里,你可以使用.replace()

currentPageUrl: req.originalUrl.replace(/page=[^&]+/, "page=" + currentPage) 

如果您不知道自己是否是有,那么你必须首先测试它:

let newUrl; 
if (req.originalUrl.indexOf("page=") !== -1) { 
    newUrl = req.originalUrl.replace(/page=[^&]+/, "page=" + currentPage); 
} else if (req.originalUrl.indexOf("?") === -1) { 
    newUrl = req.originalUrl + "?page=" + currentPage); 
} else { 
    newUrl = req.originalUrl + "&page=" + currentPage); 
} 

各种测试情况:

function updatePage(origUrl, currentPage) { 
 
    let newUrl; 
 
    if (origUrl.indexOf("page=") !== -1) { 
 
     newUrl = origUrl.replace(/page=[^&]+/, "page=" + currentPage); 
 
    } else if (origUrl.indexOf("?") === -1) { 
 
     newUrl = origUrl + "?page=" + currentPage; 
 
    } else { 
 
     newUrl = origUrl + "&page=" + currentPage; 
 
    } 
 
    return newUrl; 
 
} 
 

 
// test cases 
 
console.log(updatePage("http://somedomain.com/somePath?page=3", 5)); 
 
console.log(updatePage("http://somedomain.com/somePath?whatever=something&page=3", 5)); 
 
console.log(updatePage("http://somedomain.com/somePath", 5)); 
 
console.log(updatePage("http://somedomain.com/somePath?page=3&whatever=something", 5));


您也可以使用url库的URL解析成其组成部分,改变其中的一部分,然后重新生成完整的URL:

const url = require('url'); 

let parsedUrl = url.parse(req.originalUrl, true); 
parsedUrl.query.page = currentPage; 
delete parsedUrl.search; 
let newUrl = url.format(parsedUrl); 
+0

什么,我觉得这个工作正常在我的情况。谢谢你帮忙! – Codearts

1

我写了一个函数,它接受一个URL,一个参数和你想要的新值。我想,这不正是你想要

const url = require('url') 

uri = 'http://example.com/cat?page=1&rand=18347109823' 

function change_parameter(uri, parameter_name, new_value){ 
    parsed_uri = url.parse(uri, true) 
    parameters = [] 
    for (key in parsed_uri.query) { 
    if (key == parameter_name) { 
     parameters.push(key + "=" + new_value) 
    } else { 
     parameters.push(key + "=" + parsed_uri.query[key]) 
    } 
    } 
    return parsed_uri.protocol + "//" + parsed_uri.hostname + "?" + parameters.join("&") 
} 

console.log(change_parameter(uri, 'page', '3')) 

输出

$ node so.js 
http://example.com?page=3&rand=18347109823 
+0

感谢您的时间写这个功能!我测试了它,它工作。但是,当您的网址类似于http://example.com/animals/list/param1=5&page=3&type=dog时,它不起作用。 它使/动物/列表/ null/null /并停止工作。 – Codearts

+0

@Codearts当然,我认为'page'是一个url获取参数 –