Как выполнить итерацию по объекту @Query() в Nest js

#javascript #node.js #typescript #nestjs

#javascript #node.js #typescript #nestjs

Вопрос:

Есть ли какой-либо способ, как выполнить итерацию по объекту, который мы получили в контроллере с помощью @Query() аннотаций?

У нас есть динамическое количество и название параметров запроса в GET, поэтому нам нужно взять весь @Query() объект и выполнить итерацию по ним, чтобы узнать, какие параметры у нас точно есть.

Но если я хочу выполнить итерацию по этому объекту, я получаю сообщение об ошибке, что объект не может быть повторен.

Есть идеи, как это сделать?

Ответ №1:

Вы можете использовать Object.keys() для получения массива ключей объекта запроса. Затем вы можете выполнить итерацию по этому массиву ключей:

 @Get()
getHello(@Query() query) {
  for (const queryKey of Object.keys(query)) {
    console.log(`${queryKey}: ${query[queryKey]}`);
  }
}
  

Комментарии:

1. Вы также могли бы использовать Object.entries for (const [queryKey, queryValue] of Object.entries(query)) {} .

Ответ №2:

В контроллере nest использование @Query() / @Body() / @Headers() декоратора без аргумента вернет объект javascript с ключом-значением.

например:

     // request url: http://example.com/path-foo/path-bar?qf=1amp;qb=2

    @Post(':foo/:bar')
    async function baz(@Query() query,@Param() param) {
        const keys = Object.keys(query); // ['qf', 'qb']
        const vals = Object.values(query); // ['1', '2']
        const pairs = Object.entries(query); // [['qf','1'],['qb','2']]
        const params = Object.entries(param); // [['foo','path-foo'],['bar','path-bar']]
        // these are all iterate able array
        // so you can use any Array's built-in function
        // e.g. for / forEach / map / filter ...
    }
  

ссылка:

Объект

Object.keys()

Object.values()

Object.entries()

     // sample object
    const obj = {
      foo: 'this is foo',
      bar: 'this is bar',
      baz: 'this is baz',
    };

    Object.keys(obj);
    Object.values(obj);
    Object.entries(obj);

    /**
     * return iterable array:
     *
     * ['foo', 'bar', 'baz']
     *
     * ['this is foo', 'this is bar', 'this is baz']
     *
     * [
     *     ['foo', 'this is foo']
     *     ['bar', 'this is bar']
     *     ['baz', 'this is baz']
     * ]
     */
  

Комментарии:

1. Пожалуйста, предоставьте объяснение с вашим ответом.