You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
fix #2561
This commit is contained in:
@@ -131,7 +131,7 @@ Some command arguments/replies have changed to align more closely to data types
|
|||||||
- `LCS IDX`: `length` has been changed to `len`, `matches` has been changed from `Array<{ key1: RangeReply; key2: RangeReply; }>` to `Array<[key1: RangeReply, key2: RangeReply]>`
|
- `LCS IDX`: `length` has been changed to `len`, `matches` has been changed from `Array<{ key1: RangeReply; key2: RangeReply; }>` to `Array<[key1: RangeReply, key2: RangeReply]>`
|
||||||
- `HEXISTS`: `boolean` -> `number` [^boolean-to-number]
|
- `HEXISTS`: `boolean` -> `number` [^boolean-to-number]
|
||||||
- `HRANDFIELD_COUNT_WITHVALUES`: `Record<BlobString, BlobString>` -> `Array<{ field: BlobString; value: BlobString; }>` (it can return duplicates).
|
- `HRANDFIELD_COUNT_WITHVALUES`: `Record<BlobString, BlobString>` -> `Array<{ field: BlobString; value: BlobString; }>` (it can return duplicates).
|
||||||
- `SCAN`, `HSCAN`, `SSCAN`, and `ZSCAN`: cursor type is `string` instead of `number`?
|
- `SCAN`, `HSCAN`, `SSCAN`, and `ZSCAN`: `cursor` type is `string | Buffer` instead of `number`
|
||||||
- `HSETNX`: `boolean` -> `number` [^boolean-to-number]
|
- `HSETNX`: `boolean` -> `number` [^boolean-to-number]
|
||||||
- `ZINTER`: instead of `client.ZINTER('key', { WEIGHTS: [1] })` use `client.ZINTER({ key: 'key', weight: 1 }])`
|
- `ZINTER`: instead of `client.ZINTER('key', { WEIGHTS: [1] })` use `client.ZINTER({ key: 'key', weight: 1 }])`
|
||||||
- `ZINTER_WITHSCORES`: instead of `client.ZINTER_WITHSCORES('key', { WEIGHTS: [1] })` use `client.ZINTER_WITHSCORES({ key: 'key', weight: 1 }])`
|
- `ZINTER_WITHSCORES`: instead of `client.ZINTER_WITHSCORES('key', { WEIGHTS: [1] })` use `client.ZINTER_WITHSCORES({ key: 'key', weight: 1 }])`
|
||||||
|
@@ -6,14 +6,14 @@ describe('HSCAN', () => {
|
|||||||
describe('transformArguments', () => {
|
describe('transformArguments', () => {
|
||||||
it('cusror only', () => {
|
it('cusror only', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
HSCAN.transformArguments('key', 0),
|
HSCAN.transformArguments('key', '0'),
|
||||||
['HSCAN', 'key', '0']
|
['HSCAN', 'key', '0']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with MATCH', () => {
|
it('with MATCH', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
HSCAN.transformArguments('key', 0, {
|
HSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern'
|
MATCH: 'pattern'
|
||||||
}),
|
}),
|
||||||
['HSCAN', 'key', '0', 'MATCH', 'pattern']
|
['HSCAN', 'key', '0', 'MATCH', 'pattern']
|
||||||
@@ -22,7 +22,7 @@ describe('HSCAN', () => {
|
|||||||
|
|
||||||
it('with COUNT', () => {
|
it('with COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
HSCAN.transformArguments('key', 0, {
|
HSCAN.transformArguments('key', '0', {
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
['HSCAN', 'key', '0', 'COUNT', '1']
|
['HSCAN', 'key', '0', 'COUNT', '1']
|
||||||
@@ -31,7 +31,7 @@ describe('HSCAN', () => {
|
|||||||
|
|
||||||
it('with MATCH & COUNT', () => {
|
it('with MATCH & COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
HSCAN.transformArguments('key', 0, {
|
HSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern',
|
MATCH: 'pattern',
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
@@ -41,16 +41,17 @@ describe('HSCAN', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testUtils.testWithClient('client.hScan', async client => {
|
testUtils.testWithClient('client.hScan', async client => {
|
||||||
await client.hSet('key', 'field', 'value');
|
const [, reply] = await Promise.all([
|
||||||
assert.deepEqual(
|
client.hSet('key', 'field', 'value'),
|
||||||
await client.hScan('key', 0),
|
client.hScan('key', '0')
|
||||||
{
|
]);
|
||||||
cursor: 0,
|
|
||||||
entries: [{
|
assert.deepEqual(reply, {
|
||||||
field: 'field',
|
cursor: '0',
|
||||||
value: 'value'
|
entries: [{
|
||||||
}]
|
field: 'field',
|
||||||
}
|
value: 'value'
|
||||||
);
|
}]
|
||||||
|
});
|
||||||
}, GLOBAL.SERVERS.OPEN);
|
}, GLOBAL.SERVERS.OPEN);
|
||||||
});
|
});
|
||||||
|
@@ -11,7 +11,7 @@ export default {
|
|||||||
IS_READ_ONLY: true,
|
IS_READ_ONLY: true,
|
||||||
transformArguments(
|
transformArguments(
|
||||||
key: RedisArgument,
|
key: RedisArgument,
|
||||||
cursor: number,
|
cursor: RedisArgument,
|
||||||
options?: ScanCommonOptions
|
options?: ScanCommonOptions
|
||||||
) {
|
) {
|
||||||
return pushScanArguments(['HSCAN', key], cursor, options);
|
return pushScanArguments(['HSCAN', key], cursor, options);
|
||||||
@@ -27,7 +27,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
cursor: Number(cursor),
|
cursor,
|
||||||
entries
|
entries
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -6,14 +6,14 @@ describe('SCAN', () => {
|
|||||||
describe('transformArguments', () => {
|
describe('transformArguments', () => {
|
||||||
it('cusror only', () => {
|
it('cusror only', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SCAN.transformArguments(0),
|
SCAN.transformArguments('0'),
|
||||||
['SCAN', '0']
|
['SCAN', '0']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with MATCH', () => {
|
it('with MATCH', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SCAN.transformArguments(0, {
|
SCAN.transformArguments('0', {
|
||||||
MATCH: 'pattern'
|
MATCH: 'pattern'
|
||||||
}),
|
}),
|
||||||
['SCAN', '0', 'MATCH', 'pattern']
|
['SCAN', '0', 'MATCH', 'pattern']
|
||||||
@@ -22,7 +22,7 @@ describe('SCAN', () => {
|
|||||||
|
|
||||||
it('with COUNT', () => {
|
it('with COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SCAN.transformArguments(0, {
|
SCAN.transformArguments('0', {
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
['SCAN', '0', 'COUNT', '1']
|
['SCAN', '0', 'COUNT', '1']
|
||||||
@@ -31,7 +31,7 @@ describe('SCAN', () => {
|
|||||||
|
|
||||||
it('with TYPE', () => {
|
it('with TYPE', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SCAN.transformArguments(0, {
|
SCAN.transformArguments('0', {
|
||||||
TYPE: 'stream'
|
TYPE: 'stream'
|
||||||
}),
|
}),
|
||||||
['SCAN', '0', 'TYPE', 'stream']
|
['SCAN', '0', 'TYPE', 'stream']
|
||||||
@@ -40,7 +40,7 @@ describe('SCAN', () => {
|
|||||||
|
|
||||||
it('with MATCH & COUNT & TYPE', () => {
|
it('with MATCH & COUNT & TYPE', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SCAN.transformArguments(0, {
|
SCAN.transformArguments('0', {
|
||||||
MATCH: 'pattern',
|
MATCH: 'pattern',
|
||||||
COUNT: 1,
|
COUNT: 1,
|
||||||
TYPE: 'stream'
|
TYPE: 'stream'
|
||||||
@@ -52,9 +52,9 @@ describe('SCAN', () => {
|
|||||||
|
|
||||||
testUtils.testAll('scan', async client => {
|
testUtils.testAll('scan', async client => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
await client.scan(0),
|
await client.scan('0'),
|
||||||
{
|
{
|
||||||
cursor: 0,
|
cursor: '0',
|
||||||
keys: []
|
keys: []
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -7,7 +7,7 @@ export interface ScanCommonOptions {
|
|||||||
|
|
||||||
export function pushScanArguments(
|
export function pushScanArguments(
|
||||||
args: CommandArguments,
|
args: CommandArguments,
|
||||||
cursor: number,
|
cursor: RedisArgument,
|
||||||
options?: ScanOptions
|
options?: ScanOptions
|
||||||
): CommandArguments {
|
): CommandArguments {
|
||||||
args.push(cursor.toString());
|
args.push(cursor.toString());
|
||||||
@@ -30,7 +30,7 @@ export interface ScanOptions extends ScanCommonOptions {
|
|||||||
export default {
|
export default {
|
||||||
FIRST_KEY_INDEX: undefined,
|
FIRST_KEY_INDEX: undefined,
|
||||||
IS_READ_ONLY: true,
|
IS_READ_ONLY: true,
|
||||||
transformArguments(cursor: number, options?: ScanOptions) {
|
transformArguments(cursor: string, options?: ScanOptions) {
|
||||||
const args = pushScanArguments(['SCAN'], cursor, options);
|
const args = pushScanArguments(['SCAN'], cursor, options);
|
||||||
|
|
||||||
if (options?.TYPE) {
|
if (options?.TYPE) {
|
||||||
@@ -41,7 +41,7 @@ export default {
|
|||||||
},
|
},
|
||||||
transformReply([cursor, keys]: [BlobStringReply, ArrayReply<BlobStringReply>]) {
|
transformReply([cursor, keys]: [BlobStringReply, ArrayReply<BlobStringReply>]) {
|
||||||
return {
|
return {
|
||||||
cursor: Number(cursor),
|
cursor,
|
||||||
keys
|
keys
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -6,14 +6,14 @@ describe('SSCAN', () => {
|
|||||||
describe('transformArguments', () => {
|
describe('transformArguments', () => {
|
||||||
it('cusror only', () => {
|
it('cusror only', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SSCAN.transformArguments('key', 0),
|
SSCAN.transformArguments('key', '0'),
|
||||||
['SSCAN', 'key', '0']
|
['SSCAN', 'key', '0']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with MATCH', () => {
|
it('with MATCH', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SSCAN.transformArguments('key', 0, {
|
SSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern'
|
MATCH: 'pattern'
|
||||||
}),
|
}),
|
||||||
['SSCAN', 'key', '0', 'MATCH', 'pattern']
|
['SSCAN', 'key', '0', 'MATCH', 'pattern']
|
||||||
@@ -22,7 +22,7 @@ describe('SSCAN', () => {
|
|||||||
|
|
||||||
it('with COUNT', () => {
|
it('with COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SSCAN.transformArguments('key', 0, {
|
SSCAN.transformArguments('key', '0', {
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
['SSCAN', 'key', '0', 'COUNT', '1']
|
['SSCAN', 'key', '0', 'COUNT', '1']
|
||||||
@@ -31,7 +31,7 @@ describe('SSCAN', () => {
|
|||||||
|
|
||||||
it('with MATCH & COUNT', () => {
|
it('with MATCH & COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
SSCAN.transformArguments('key', 0, {
|
SSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern',
|
MATCH: 'pattern',
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
@@ -42,9 +42,9 @@ describe('SSCAN', () => {
|
|||||||
|
|
||||||
testUtils.testAll('sScan', async client => {
|
testUtils.testAll('sScan', async client => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
await client.sScan('key', 0),
|
await client.sScan('key', '0'),
|
||||||
{
|
{
|
||||||
cursor: 0,
|
cursor: '0',
|
||||||
members: []
|
members: []
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -6,14 +6,14 @@ export default {
|
|||||||
IS_READ_ONLY: true,
|
IS_READ_ONLY: true,
|
||||||
transformArguments(
|
transformArguments(
|
||||||
key: RedisArgument,
|
key: RedisArgument,
|
||||||
cursor: number,
|
cursor: RedisArgument,
|
||||||
options?: ScanCommonOptions
|
options?: ScanCommonOptions
|
||||||
) {
|
) {
|
||||||
return pushScanArguments(['SSCAN', key], cursor, options);
|
return pushScanArguments(['SSCAN', key], cursor, options);
|
||||||
},
|
},
|
||||||
transformReply([cursor, members]: [BlobStringReply, Array<BlobStringReply>]) {
|
transformReply([cursor, members]: [BlobStringReply, Array<BlobStringReply>]) {
|
||||||
return {
|
return {
|
||||||
cursor: Number(cursor),
|
cursor,
|
||||||
members
|
members
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -6,14 +6,14 @@ describe('ZSCAN', () => {
|
|||||||
describe('transformArguments', () => {
|
describe('transformArguments', () => {
|
||||||
it('cusror only', () => {
|
it('cusror only', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
ZSCAN.transformArguments('key', 0),
|
ZSCAN.transformArguments('key', '0'),
|
||||||
['ZSCAN', 'key', '0']
|
['ZSCAN', 'key', '0']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with MATCH', () => {
|
it('with MATCH', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
ZSCAN.transformArguments('key', 0, {
|
ZSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern'
|
MATCH: 'pattern'
|
||||||
}),
|
}),
|
||||||
['ZSCAN', 'key', '0', 'MATCH', 'pattern']
|
['ZSCAN', 'key', '0', 'MATCH', 'pattern']
|
||||||
@@ -22,7 +22,7 @@ describe('ZSCAN', () => {
|
|||||||
|
|
||||||
it('with COUNT', () => {
|
it('with COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
ZSCAN.transformArguments('key', 0, {
|
ZSCAN.transformArguments('key', '0', {
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
['ZSCAN', 'key', '0', 'COUNT', '1']
|
['ZSCAN', 'key', '0', 'COUNT', '1']
|
||||||
@@ -31,7 +31,7 @@ describe('ZSCAN', () => {
|
|||||||
|
|
||||||
it('with MATCH & COUNT', () => {
|
it('with MATCH & COUNT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
ZSCAN.transformArguments('key', 0, {
|
ZSCAN.transformArguments('key', '0', {
|
||||||
MATCH: 'pattern',
|
MATCH: 'pattern',
|
||||||
COUNT: 1
|
COUNT: 1
|
||||||
}),
|
}),
|
||||||
@@ -42,9 +42,9 @@ describe('ZSCAN', () => {
|
|||||||
|
|
||||||
testUtils.testWithClient('zScan', async client => {
|
testUtils.testWithClient('zScan', async client => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
await client.zScan('key', 0),
|
await client.zScan('key', '0'),
|
||||||
{
|
{
|
||||||
cursor: 0,
|
cursor: '0',
|
||||||
members: []
|
members: []
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -12,14 +12,14 @@ export default {
|
|||||||
IS_READ_ONLY: true,
|
IS_READ_ONLY: true,
|
||||||
transformArguments(
|
transformArguments(
|
||||||
key: RedisArgument,
|
key: RedisArgument,
|
||||||
cursor: number,
|
cursor: RedisArgument,
|
||||||
options?: ScanCommonOptions
|
options?: ScanCommonOptions
|
||||||
) {
|
) {
|
||||||
return pushScanArguments(['ZSCAN', key], cursor, options);
|
return pushScanArguments(['ZSCAN', key], cursor, options);
|
||||||
},
|
},
|
||||||
transformReply([cursor, rawMembers]: [BlobStringReply, ArrayReply<BlobStringReply>]) {
|
transformReply([cursor, rawMembers]: [BlobStringReply, ArrayReply<BlobStringReply>]) {
|
||||||
return {
|
return {
|
||||||
cursor: Number(cursor),
|
cursor,
|
||||||
members: transformSortedSetReply[2](rawMembers)
|
members: transformSortedSetReply[2](rawMembers)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user