Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proto. When the field of the query string passed by the front end is an empty string, the field parsed by the back end is nil. #3117

Closed
jeanh0w opened this issue Dec 12, 2023 · 3 comments
Labels
question Further information is requested

Comments

@jeanh0w
Copy link

jeanh0w commented Dec 12, 2023

What happened:

proto中定义optional的字段,当前端传的query string的字段是空字符串时,后端解析到的字段是nil

What you expected to happen:

希望后端查询到的字段是非nil

How to reproduce it (as minimally and precisely as possible):

proto 定义如下:

message UserDetailReply {
optional string Status = 1;
}

启动服务,查询接口:http://localhost:8888/?Status=

后端入参:req *pb.UserDetailRequest
打印出 fmt.Println(req.Status) 结果是 nil
希望得到的结果是非nil,*req.Status取到空字符串

Anything else we need to know?:

如果当前是 Post 请求,在body里传 {"Status":""},后端是可以正常得到非nil的 req.Status
当是 Get 请求,query string 里 传 Status= 后端得到的req.Status就是nil

经过调试后发现是如下代码将字段设置为nil:
CleanShot 2023-12-12 at 18 30 02@2x

请问这样设计的原因是什么呢?

Environment:

  • Kratos version (use kratos -v): kratos version v2.7.1
  • Go version (use go version): go version go1.21.1 darwin/amd64
  • OS (e.g: cat /etc/os-release):
  • Others:
@jeanh0w jeanh0w added the bug Something isn't working label Dec 12, 2023
@kratos-ci-bot kratos-ci-bot changed the title proto中定义optional的字段,当前端传的query string的字段是空字符串时,后端解析到的字段是nil proto. When the field of the query string passed by the front end is an empty string, the field parsed by the back end is nil. Dec 12, 2023
Copy link

dosubot bot commented Dec 12, 2023

🤖

感谢您的反馈。我看到您在使用Kratos v2.7.1版本,但是最新的版本是v2.7.2。我想知道您是否尝试过在最新版本上复现这个问题?

另外,我需要更多的信息来帮助我理解这个问题。您能提供一些关于您的环境的更多信息吗?例如,您正在使用的操作系统和版本,以及您的Go环境配置等。

最后,如果可能的话,能否提供一些更详细的代码示例,以便我更好地理解您的问题?这将有助于我更准确地找到问题的原因。

期待您的回复。


This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

@shenqidebaozi shenqidebaozi added question Further information is requested and removed bug Something isn't working labels Dec 13, 2023
@kvii
Copy link
Contributor

kvii commented Feb 5, 2024

@tonybase Why did you add a if value == "" { return nil } is this #2848? It caused this issue. changes detail

See the code below, should we return errors in parseField when "fd" is a non-string kind and value is ""?

func populateField(fd protoreflect.FieldDescriptor, v protoreflect.Message, value string) error {
if value == "" {
return nil
}
val, err := parseField(fd, value)
if err != nil {
return fmt.Errorf("parsing field %q: %w", fd.FullName().Name(), err)
}
v.Set(fd, val)
return nil
}

func parseField(fd protoreflect.FieldDescriptor, value string) (protoreflect.Value, error) {
switch fd.Kind() {
case protoreflect.BoolKind:
v, err := strconv.ParseBool(value)
if err != nil {
return protoreflect.Value{}, err
}
return protoreflect.ValueOfBool(v), nil

@dosubot dosubot bot added the stale Issue has not had recent activity or appears to be solved. Stale issues will be automatically closed label May 6, 2024
Copy link

dosubot bot commented May 6, 2024

Hi, @jeanh0w,

I'm helping the Kratos team manage their backlog and am marking this issue as stale. The issue concerns the back end parsing an empty string as nil instead of an empty string in Kratos version v2.7.1 and Go version go1.21.1. There have been discussions about checking if the issue persists in the latest version, v2.7.2, and requests for more information about the user's environment. Additionally, there are questions about a specific code change that may have caused the issue and links to the relevant code sections for further investigation.

Could you please confirm if this issue is still relevant to the latest version of the Kratos repository? If it is, please let the Kratos team know by commenting on the issue. Otherwise, feel free to close the issue yourself, or the issue will be automatically closed in 7 days.

Thank you for your understanding and cooperation. If you have any further questions or updates, feel free to reach out.

@dosubot dosubot bot closed this as not planned Won't fix, can't repro, duplicate, stale May 13, 2024
@dosubot dosubot bot removed the stale Issue has not had recent activity or appears to be solved. Stale issues will be automatically closed label May 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants