V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Waihinchan
V2EX  ›  问与答

为什么我的表单 post 了一个数字,后台接收到之后变成了 string?

  •  
  •   Waihinchan · 2020-05-21 06:50:51 +08:00 · 2579 次点击
    这是一个创建于 1676 天前的主题,其中的信息可能已经有所发展或是发生改变。

    html 是这么个写法:

    <form action="gamepage" method="post" >
        Player name: <input type="text" name=player_id value="player1"><br>
        Room name: <input type="text" name=room_id value="room1"><br>
        Player amount: <input type="number" name=player_amount value=4><br>
        <input type="submit" value="提交">
        </form>
    

    第三个 player_amount 那里我应该是设置了数字的

    服务器用 nodejs 接收这个 post 请求用的 bodyParser

    app.post('/gamepage',function(req,res){ 
        console.log('gamepage request');
        console.log(typeof(req.body.player_amount));});
    

    然后 console.log 了一下结果是这样的: string { player_id: 'player1', room_id: 'room1', player_amount: '4' }

    所以问题发生在我的表单提交的时候没有设置对格式还是我用错了中间件呢?初学服务器后台这些,对数据的格式也不是很熟悉,折腾了好久。 小弟先感谢各位老哥了。

    9 条回复    2020-05-21 08:19:15 +08:00
    meso5533
        1
    meso5533  
       2020-05-21 07:32:18 +08:00
    你看一下开发者工具里面的网络请求,看一下这个 POST 请求的 body 长什么样,你就知道上传的请参数根本没区分 string 还是 number
    wangxiaoaer
        2
    wangxiaoaer  
       2020-05-21 07:37:09 +08:00 via Android
    HTTP 协议传数据的时候可不管你什么格式的,你需要后台自己解析,当然有些通用的比如文件,json 等类型你采用的 web 框架(servlet node 等)可能会帮你解析。
    baiyi
        3
    baiyi  
       2020-05-21 07:54:56 +08:00
    post 的数据在 body 里,通过 HTTP 协议的 Content-Type 指定编码格式,如果你不设置 form 的 enctype 属性,默认是 application/x-www-form-urlencoded 编码。如果你想要精确类型的编码,一种常见的选择是使用 application/json 。
    Waihinchan
        4
    Waihinchan  
    OP
       2020-05-21 07:59:31 +08:00 via Android
    @meso5533 我之前直接用 xmlhttprequest 看过是正常的 但是我后来用表单来发送请求就变了 但是看这结论应该是我解析过程出现了问题 我再去试试 谢谢啦
    Waihinchan
        5
    Waihinchan  
    OP
       2020-05-21 08:02:16 +08:00 via Android
    @baiyi 我晓得~现在的情况是我后台的确能解析成我想要的 但是其中一个字段就变成了一个字符 按道理应该是数字来的 我之前试过直接发送一个对象解析是 OK 的 所以还是疑惑是不是我的表单出了问题
    zachlhb
        6
    zachlhb  
       2020-05-21 08:03:03 +08:00 via Android
    表单提交的所有数据都是 string,input 上的 type 为 number 只是用来限制输入框的输入类型,并不代表提交到后台就是 int 类型,你要 int 类型后台接收到要自己转换一下
    Waihinchan
        7
    Waihinchan  
    OP
       2020-05-21 08:03:57 +08:00 via Android
    @zachlhb 好的!明白了!那我去做个类型转换好了
    Waihinchan
        8
    Waihinchan  
    OP
       2020-05-21 08:06:52 +08:00 via Android
    emmm 所以现在补充说明情况是 我能解析成 json 但是有一个数字的字段变成了 string 根据 6 楼的老哥说的是表单发送都是 string 所以我得手动转换
    或者说有没有别的方法呢…?
    crella
        9
    crella  
       2020-05-21 08:19:15 +08:00 via Android
    浏览器以 json 形式上传,服务器以 json 形式解析。
    可以看看 json 的序列化和反序列化是怎么做的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   900 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:12 · PVG 06:12 · LAX 14:12 · JFK 17:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.