首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端是带有NgRx数据的角度8;服务器是NestJs + MySQL.如何使用标准和SQL获取数据?

客户端是带有NgRx数据的角度8;服务器是NestJs + MySQL.如何使用标准和SQL获取数据?
EN

Stack Overflow用户
提问于 2020-06-09 02:11:32
回答 1查看 178关注 0票数 0

随着角形,NgRx-Data和NestJ越来越受欢迎,我觉得可能会有相当多的程序员想知道下面的查询语法。

我有一个运行的原型客户端(前端)组成的角度8与NgRx-数据。后端是一个基于NestJs的服务器+ MySQL。

除了查询之外,我可以很好地在所有部分之间检索和传递数据。我似乎找不到关于语法的适当文档。

下面是如何设置客户端的示例:

代码语言:javascript
复制
                        // Simple entity example (all ngrx-data metadata are declared and set):
export class Hero { 
    id: number;
    name?: string;
    age?: number;
}

实体服务/用于获取数据

代码语言:javascript
复制
@Injectable({providedIn: 'root'})
export class HeroService extends EntityCollectionServiceBase<Hero> {
  constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
    super('Hero', serviceElementsFactory);
  }
}

用于显示数据的组件

代码语言:javascript
复制
@Component({
  selector: 'hero-comp',
  templateUrl: './hero.component.html', 
  styleUrls: ['./hero.component.scss']
})
export class HeroComponent {
    heroData$: Observable<Hero[]>;
    constructor(private heroDatService: HeroService) {
        this.heroData$ = this.heroDatService.entities$;
    }

    private getAllData() {
                          // This works nicely, I get all records from the db via server
        this.heroDatService.getAll();
    }

    private queryData() {
                          // This queryParams syntax fails - server complains with this error:
                          //      [HttpExceptionFilter] GET /hero/?age>20 
                          //      QueryFailedError: ER_EMPTY_QUERY: Query was empty
                          // QUESTION: What is the proper syntax?
        let queryParams: QueryParams = {
            'age > 20'
        }
        this.fetchDataService.getWithQuery(queryParams);
    }

下面是与服务器相关的代码摘录:-(这里有一个服务,但为了简单起见,我将回购函数移到控制器函数中):

代码语言:javascript
复制
@Controller('hero')
export class HeroController <Hero> {
    constructor(readonly repo: Repository<Hero>) {}

                          // This returns nicely all Hero records from the MySQL db server
@Get()
async getAll(): Promise<Hero[]> {
    return await this.repo.find();
} 
                          // This does not work !
                          // I am not sure about any piece of the code here !
@Get('query')
async query(@Query() sql): Promise<any> {
                          // Does the sql argument need to be manipulated into parameters: {...} ?
                          // If yes - how ?
    let parameters: undefined;
    return await this.repo.query(sql, parameters);
}

请参阅每一行代码上面的注释--问题已经在这里详细说明了。

以下是一些重要的问题:

在客户端上,我们如何正确地传递这些示例的查询标准:-{‘client 20’> 20'} -{‘年龄在20 ~ 40'} - {'age =20或age = 30或age = 40'} - {'name =“Superman”}- {'name类似于“Super%”}’等等。

另外,传递完整SQL语句的语法是什么,例如:- {'SELECT * FROM Heroes,名称为"Super%“和Age >20;}以及从服务器获取结果。

为了使这些查询工作,需要在两端(客户机和服务器)做什么?

所有的投入都非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 03:10:19

您似乎对HTTP查询参数和SQL查询感到困惑,这是两个不同的主题。HTTP上下文中的查询参数是可以从客户端传递到服务器并修改HTTP调用结果的参数。查询参数是总是以<key>=<value>的形式从<key>=<value>中的?开始传递,然后用&分隔。

SQL查询是一个特定的字符串,它告诉SQL服务器要查询什么表、查询哪些列、使用什么条件进行查询。通常以SELECT <columns> FROM <table> WHERE <conditions>;的形式出现,但它们可能要复杂得多。

既然定义已经过时了,您想要到达的端点应该是/hero/query。最后,您需要在服务器端执行大量数据处理的,清理,确保传入的字符串适合SQL子句,确保不会受到SQL注入的攻击(如果您将查询参数直接传递到查询中,您将是这样的),但是非常非常天真的方法如下所示:

代码语言:javascript
复制
@Controller('hero')
export class HeroController {

  constructor(@InjectRepository(Hero) private readonly repo: Repository<Hero>) {}
  @Get('query')
  queryForHero(@Query() queryParam) {
    return this.repo.query(`SELECT <field_go_here> FROM Hero WHERE ${queryParams.query};`);
  }
}

出于对世界上所有美好事物的热爱,不要实际使用上面的代码。它100%易受各种SQL注入的影响。

相应的请求可能类似于

代码语言:javascript
复制
curl http://<host>/hero/query?query=Name%3D%27Superman%27

这将导致服务器使用查询。

代码语言:javascript
复制
SELECT <fields_go_here> FROM Hero WHERE Name='Superman';

在将其发送到server 以免你变成小波比桌之前,您确实需要对服务器中的内容添加大量的验证。

希望这能让你走上正确的道路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62273942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档