GraphQL 查询语法错误
GraphQL Query syntax error
我正在使用此 GraphQl nuget 在我的系统中使用以下代码
实现一般查询
if (!string.IsNullOrEmpty(query))
{
var urlDecode = HttpUtility.UrlDecode(query);
var result =
await (_searchRepository.ExecuteQuery(urlDecode.Replace("\t", "").Replace(@"\", string.Empty))).ConfigureAwait(false);
response = Request.CreateResponse(HttpStatusCode.OK,
new GeneralOutput() {HasError = false, Data = result});
}
else
{
response = Request.CreateResponse(HttpStatusCode.OK,
new GeneralOutput() { HasError = true, Data = null , ErrorType = ErrorType.ValidationError , Message = "Empty Query String"});
}
其中执行查询看起来像
public async Task<string> ExecuteQuery(string querystring)
{
try
{
var result = await new DocumentExecuter().ExecuteAsync(_ =>
{
_.Schema = new Schema { Query = new ViewerType() };
_.Query = querystring;
}).ConfigureAwait(false);
var json = new DocumentWriter(Formatting.None, null).Write(result);
return json;
}
catch (Exception e)
{
var logInstance = LogManager.GetCurrentClassLogger();
logInstance?.Error(e,
$" {MethodBase.GetCurrentMethod().Name} => {e.Message}{Environment.NewLine}{e.StackTrace}");
return null;
}
}
GraqhQL 的主要组件是这样的
public class ViewerType : ObjectGraphType
{
public ViewerType()
{
Name = "Viewer";
Field<QueryResult>("MediaSearch",
arguments: new QueryArguments(
new QueryArgument<StringGraphType> { Name = "userTwelveDigits", DefaultValue = null},
new QueryArgument<DateGraphType> { Name = "fromcreationDate", DefaultValue = null },
new QueryArgument<DateGraphType> { Name = "tocreationDate", DefaultValue = null } ,
new QueryArgument<StringGraphType> { Name = "mediaId", DefaultValue = null },
new QueryArgument<IntGraphType> { Name = "versionTypeId", DefaultValue = null },
new QueryArgument<StringGraphType> { Name = "keyword", DefaultValue = null }
),
resolve: context => (new BaseService<MediaQuery_Result>()).Context.MediaQuery(
context.GetArgument<string>("userTwelveDigits"),
context.GetArgument<DateTime?>("fromcreationDate", null),
context.GetArgument<DateTime?>("tocreationDate", null),
context.GetArgument<string>("mediaId"),
context.GetArgument<int?>("versionTypeId", null),
context.GetArgument<string>("keyword")
));
}
}
public class QueryResult : ObjectGraphType<MediaQuery_Result>
{
public QueryResult()
{
Field(m => m.MediaId).Description("The Media Id");
Field(m => m.MediaTitle).Description("The Media Title");
Field(m => m.MediaIdentifier).Description("The Media Identifier");
Field(m => m.MP4Path).Description("The Media mp4 Path");
Field(m => m.DataS3Path).Description("The Media S3 Path");
Field(m => m.InSync.Value).Description("The Media In Sync or not").Name("InSync");
Field(m => m.IsLinked.Value).Description("The media (video) if linked before or not ").Name("IsLinked");
Field(m => m.IsPublished.Value).Description("The Media If is published or not ").Name("IsPublished");
}
}
我使用了不同的 graphql 查询字符串,但它不起作用示例
query MediaSearch
{
MediaTitle
MediaIdentifier
}
query MediaSearch(userTwelveDigits:"12345678",fromcreationDate:null,tocreationDate:null,mediaId:null,versionTypeId:null,keyword:null) { MediaTitle MediaIdentifier }
我总是出错
"{\"errors\":[{\"message\":\"Syntax Error GraphQL (1:19) Expected $, found Name \\"userTwelveDigits\\"\n1: query MediaSearch(userTwelveDigits:\\"12345678\\",fromcreationDate:null,tocreationDate:null,mediaId:null,versionTypeId:null,keyword:null) { MediaTitle MediaIdentifier }\n ^\n\"}]}"
知道如何解决这个问题
这是一个常见的错误,它使用了 GraphQL 的 "Operation name",更像是一个装饰函数名称,作为查询字段。这是获取您要求的数据的查询:
query MyQueryName {
MediaSearch {
MediaTitle
MediaIdentifier
}
}
这里是你传递参数的方式——他们在场上:
query MyQueryName {
MediaSearch(mediaId: "asdf") {
MediaTitle
MediaIdentifier
}
}
如果您想了解有关 GraphQL 的更多信息,我建议您快速浏览网站上的 "learn" 部分,包括查询和模式:http://graphql.org/learn/
请注意,上面的MyQueryName
可以是任何内容,完全不影响查询结果。它只是用于服务器端日志记录,以便您可以轻松识别此查询。
编辑 - 我写了一篇博客 post 关于查询的所有不同部分,受这个问题的启发! https://dev-blog.apollodata.com/the-anatomy-of-a-graphql-query-6dffa9e9e747#.lf93twh8x
我正在使用此 GraphQl nuget 在我的系统中使用以下代码
实现一般查询 if (!string.IsNullOrEmpty(query))
{
var urlDecode = HttpUtility.UrlDecode(query);
var result =
await (_searchRepository.ExecuteQuery(urlDecode.Replace("\t", "").Replace(@"\", string.Empty))).ConfigureAwait(false);
response = Request.CreateResponse(HttpStatusCode.OK,
new GeneralOutput() {HasError = false, Data = result});
}
else
{
response = Request.CreateResponse(HttpStatusCode.OK,
new GeneralOutput() { HasError = true, Data = null , ErrorType = ErrorType.ValidationError , Message = "Empty Query String"});
}
其中执行查询看起来像
public async Task<string> ExecuteQuery(string querystring)
{
try
{
var result = await new DocumentExecuter().ExecuteAsync(_ =>
{
_.Schema = new Schema { Query = new ViewerType() };
_.Query = querystring;
}).ConfigureAwait(false);
var json = new DocumentWriter(Formatting.None, null).Write(result);
return json;
}
catch (Exception e)
{
var logInstance = LogManager.GetCurrentClassLogger();
logInstance?.Error(e,
$" {MethodBase.GetCurrentMethod().Name} => {e.Message}{Environment.NewLine}{e.StackTrace}");
return null;
}
}
GraqhQL 的主要组件是这样的
public class ViewerType : ObjectGraphType
{
public ViewerType()
{
Name = "Viewer";
Field<QueryResult>("MediaSearch",
arguments: new QueryArguments(
new QueryArgument<StringGraphType> { Name = "userTwelveDigits", DefaultValue = null},
new QueryArgument<DateGraphType> { Name = "fromcreationDate", DefaultValue = null },
new QueryArgument<DateGraphType> { Name = "tocreationDate", DefaultValue = null } ,
new QueryArgument<StringGraphType> { Name = "mediaId", DefaultValue = null },
new QueryArgument<IntGraphType> { Name = "versionTypeId", DefaultValue = null },
new QueryArgument<StringGraphType> { Name = "keyword", DefaultValue = null }
),
resolve: context => (new BaseService<MediaQuery_Result>()).Context.MediaQuery(
context.GetArgument<string>("userTwelveDigits"),
context.GetArgument<DateTime?>("fromcreationDate", null),
context.GetArgument<DateTime?>("tocreationDate", null),
context.GetArgument<string>("mediaId"),
context.GetArgument<int?>("versionTypeId", null),
context.GetArgument<string>("keyword")
));
}
}
public class QueryResult : ObjectGraphType<MediaQuery_Result>
{
public QueryResult()
{
Field(m => m.MediaId).Description("The Media Id");
Field(m => m.MediaTitle).Description("The Media Title");
Field(m => m.MediaIdentifier).Description("The Media Identifier");
Field(m => m.MP4Path).Description("The Media mp4 Path");
Field(m => m.DataS3Path).Description("The Media S3 Path");
Field(m => m.InSync.Value).Description("The Media In Sync or not").Name("InSync");
Field(m => m.IsLinked.Value).Description("The media (video) if linked before or not ").Name("IsLinked");
Field(m => m.IsPublished.Value).Description("The Media If is published or not ").Name("IsPublished");
}
}
我使用了不同的 graphql 查询字符串,但它不起作用示例
query MediaSearch
{
MediaTitle
MediaIdentifier
}
query MediaSearch(userTwelveDigits:"12345678",fromcreationDate:null,tocreationDate:null,mediaId:null,versionTypeId:null,keyword:null) { MediaTitle MediaIdentifier }
我总是出错
"{\"errors\":[{\"message\":\"Syntax Error GraphQL (1:19) Expected $, found Name \\"userTwelveDigits\\"\n1: query MediaSearch(userTwelveDigits:\\"12345678\\",fromcreationDate:null,tocreationDate:null,mediaId:null,versionTypeId:null,keyword:null) { MediaTitle MediaIdentifier }\n ^\n\"}]}"
知道如何解决这个问题
这是一个常见的错误,它使用了 GraphQL 的 "Operation name",更像是一个装饰函数名称,作为查询字段。这是获取您要求的数据的查询:
query MyQueryName {
MediaSearch {
MediaTitle
MediaIdentifier
}
}
这里是你传递参数的方式——他们在场上:
query MyQueryName {
MediaSearch(mediaId: "asdf") {
MediaTitle
MediaIdentifier
}
}
如果您想了解有关 GraphQL 的更多信息,我建议您快速浏览网站上的 "learn" 部分,包括查询和模式:http://graphql.org/learn/
请注意,上面的MyQueryName
可以是任何内容,完全不影响查询结果。它只是用于服务器端日志记录,以便您可以轻松识别此查询。
编辑 - 我写了一篇博客 post 关于查询的所有不同部分,受这个问题的启发! https://dev-blog.apollodata.com/the-anatomy-of-a-graphql-query-6dffa9e9e747#.lf93twh8x