как экранировать переменные для запроса graphql - PullRequest
0 голосов
/ 10 сентября 2018

Я использую Angular 6, чтобы написать свой сайт с Apollo для взаимодействия с сервером GraphPL.Я хотел бы иметь возможность экранировать параметры, которые я получаю от клиента, прежде чем добавить их в мой gql запрос.

это мой служебный файл:

import { Injectable } from '@angular/core';
import {Apollo} from 'apollo-angular';
import gql from 'graphql-tag';

@Injectable({
  providedIn: 'root'
})
export class ProductService {

  constructor(private apollo: Apollo) { }

  searchForProduct(productName: string) {
    return this.apollo.watchQuery<any>({
    query: gql`{products_by_p_name_search(lang_id:1,query:"${productName}")
    {category_id,price,category_name,id,name,desc,quantity,year_manufacture,image_file}}`
    });
  }

}

, как вы видитездесь функция searchForProduct получает параметр productName, который я добавляю в свой запрос gql.как мне избежать этого, чтобы запрос не прерывался, если он содержит специальные символы?

спасибо!

1 Ответ

0 голосов
/ 10 сентября 2018

В GraphQL ваши запросы должны быть статическими, это означает, что строка запроса не должна изменяться во время выполнения (я бы хотел, чтобы было больше рекомендаций по обмену, извините за это) .Для достижения этого GraphQL поставляется с поддержкой переменных.Переменные определяются внутри строки запроса и затем отправляются на сервер в другом свойстве.

Пример запроса:

query getProducts($productName: String!) {
  products_by_p_name_search(lang_id:1,query: $productName) {
    category_id
    price
    category_name
    id
    name
    desc
    quantity
    year_manufacture
    image_file
  }
}

Затем добавьте переменные в вызов клиента:

return this.apollo.watchQuery<any>({
  query, //...
  variables: { productName }
});

Таким образом, для GraphQL (!) Не требуется экранирование.

...