feat: Extend res.links() to allow adding multiple links with the same rel (closes #2729) (#4885)
Some checks failed
ci / Lint (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (18, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (19, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (20, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (21, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (22, windows-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, ubuntu-latest) (push) Has been cancelled
ci / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (23, windows-latest) (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (16, windows-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, ubuntu-latest) (push) Has been cancelled
legacy / Node.js ${{ matrix.node-version }} - ${{matrix.os}} (17, windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
ci / coverage (push) Has been cancelled
legacy / coverage (push) Has been cancelled

This commit is contained in:
Andrea Polverino 2025-02-14 17:20:53 +01:00 committed by GitHub
parent 6ed3439584
commit caa4f68ee8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 4 deletions

View File

@ -11,6 +11,7 @@ unreleased
* Remove unused `depd` dependency * Remove unused `depd` dependency
* Add support for `Uint8Array` in `res.send` * Add support for `Uint8Array` in `res.send`
* Add support for ETag option in res.sendFile * Add support for ETag option in res.sendFile
* Extend res.links() to allow adding multiple links with the same rel
* deps: debug@^4.4.0 * deps: debug@^4.4.0
* deps: body-parser@^2.1.0 * deps: body-parser@^2.1.0
* deps: router@^2.1.0 * deps: router@^2.1.0

View File

@ -80,7 +80,11 @@ res.status = function status(code) {
* *
* res.links({ * res.links({
* next: 'http://api.example.com/users?page=2', * next: 'http://api.example.com/users?page=2',
* last: 'http://api.example.com/users?page=5' * last: 'http://api.example.com/users?page=5',
* pages: [
* 'http://api.example.com/users?page=1',
* 'http://api.example.com/users?page=2'
* ]
* }); * });
* *
* @param {Object} links * @param {Object} links
@ -88,11 +92,18 @@ res.status = function status(code) {
* @public * @public
*/ */
res.links = function(links){ res.links = function(links) {
var link = this.get('Link') || ''; var link = this.get('Link') || '';
if (link) link += ', '; if (link) link += ', ';
return this.set('Link', link + Object.keys(links).map(function(rel){ return this.set('Link', link + Object.keys(links).map(function(rel) {
return '<' + links[rel] + '>; rel="' + rel + '"'; // Allow multiple links if links[rel] is an array
if (Array.isArray(links[rel])) {
return links[rel].map(function (singleLink) {
return `<${singleLink}>; rel="${rel}"`;
}).join(', ');
} else {
return `<${links[rel]}>; rel="${rel}"`;
}
}).join(', ')); }).join(', '));
}; };

View File

@ -43,5 +43,23 @@ describe('res', function(){
.expect('Link', '<http://api.example.com/users?page=2>; rel="next", <http://api.example.com/users?page=5>; rel="last", <http://api.example.com/users?page=1>; rel="prev"') .expect('Link', '<http://api.example.com/users?page=2>; rel="next", <http://api.example.com/users?page=5>; rel="last", <http://api.example.com/users?page=1>; rel="prev"')
.expect(200, done); .expect(200, done);
}) })
it('should set multiple links for single rel', function (done) {
var app = express();
app.use(function (req, res) {
res.links({
next: 'http://api.example.com/users?page=2',
last: ['http://api.example.com/users?page=5', 'http://api.example.com/users?page=1']
});
res.end();
});
request(app)
.get('/')
.expect('Link', '<http://api.example.com/users?page=2>; rel="next", <http://api.example.com/users?page=5>; rel="last", <http://api.example.com/users?page=1>; rel="last"')
.expect(200, done);
})
}) })
}) })