Discuss / JavaScript / 既然没人评论,那我抢个沙发先 :-)

既然没人评论,那我抢个沙发先 :-)

Topic source

eterinfi

#1 Created at ... [Delete] [Delete and Lock User]

一个偶然的机会发现了这个网站开始学习,不知不觉已经过去一个多月了。起初是Python,然后JS,直至Node,方能亲身体会到Web开发之不易(下一步打算再挑战一下Python的Web开发实战部分,目测那个复杂度比起这个有过之而不及)。廖老师提供的教程结构清晰,文笔流畅,信息量大,内容新颖(比如本JS教程更新到ES6标准,而Node部分甚至用了尚未发布的ES7的方法),为网上流传的同类教程所不及,在此向廖老师聊表敬意!美中不足之处也正是由于本教程包含的内容跨度大,因篇幅所限未能对其中部分较为艰深抽象的内容充分展开,因而初学者浏览过后难免会有走马观花之感,有时需要参考其他相关教程结合自己反复摸索方可掌握。

好在廖老师同时提供了Github上的开源代码供学习参考,赞一个!不过一路学习下来发现似乎还是小坑有可以debug的:

一、mysql > 建立Model 末尾提到利用Sequelize的sync方法可以自动创建数据库,但是有好几个问题没讲清楚:一、前面说这个功能在开发和生产环境中没有什么用,但是在测试环境中非常有用,后面又说在开发环境下首次使用sync也可以自动创建出表结构,似乎前后矛盾;二、提供了调用sync方法的的代码(init-db.js),但没说应该如何调用该模块(自动?手动?);三、我试了在命令行中运行node init-db.js,输出显示似乎一切ok,却没能成功创建出表结构,最后还得在MySQL命令行中手动运行SQL命令,也不明白是什么原因。

二、mocha > 编写测试 提到了三种运行测试的方法,其中方法一中的node_modules\mocha\bin\mocha在Windows环境下并非可执行文件,前面须加上node命令方可运行。

三、WebSocket > 使用ws 末尾写到由于服务器在响应connection事件时不检查请求的路径,因此在客户端打开ws连接可以写任意的路径。的确,对于hello-ws这样级别的project来说没有问题,但在ws-with-koa这样需要读取cookie内容验证客户身份的project中问题就来了:WebSocket > 编写聊天室 中客户端页面用var ws = new WebSocket('ws://localhost:3000/ws/chat'); 创建ws连接时,实测在浏览器地址栏输入 localhost:3000 打开页面时一切正常;输入 127.0.0.1:3000 打开首页时正常,但登陆聊天室页面时ws连接会立即断开同时VSCode报错,经查原因为parseUser()中未能从cookie文件中get到name属性的值,以致parseUser()未能返回值到createWebSocketServer()中的user对象,导致ws连接被关闭及在OnConnect()中调用未定义的user对象发生错误;在局域网内其它设备的浏览器地址栏输入本机IP地址 192.168.0.x:3000登陆聊天室页面时ws连接同样立即断开,但VSCode不报错,原因暂未查明。经试验,若将views\room.html中创建WebSocket对象实例写的主机名称由localhost改成127.0.0.1或主机IP地址后,结果同样是在浏览器中输入相同的主机名称登陆聊天室页面一切正常,输入不同的主机名称则ws连接被断开,最后将创建WebSocket连接语句的路径改成ws://${location.hostname}:3000/ws/chat,总算解决了此问题。另外,经测试在Chrome、Firefox、Opera、MS Edge中显示页面均正常,惟以IE11登陆聊天室页面时脚本停止运行,不知原因何在,请高人指点(前面讲过的IE10以上版本支持WebSocket)。

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

实践得太仔细了,赞一个!

因为只有Mac环境测试,Win环境可能会有一些问题

Cookie是跟域名绑定的,所以要么全部localhost,要么全部127.0.0.1

IE历来坑多,好在Win10以后退出历史舞台了

iFayeee

#3 Created at ... [Delete] [Delete and Lock User]

喜欢上廖大的教程了,非常棒,赞助19元,等找到工作了赞助个大额的。

eterinfi

#4 Created at ... [Delete] [Delete and Lock User]

感谢廖老师的回复!今天才恍然大悟原来是因为IE11也只支持到ES5语法,模板文件中路径用了模板字符串的话就会导致在用IE打开时脚本停止运行,改成普通字符串格式就好了,看来廖老师的教程内容确实够超前的,以后打算从事前端开发的话还得多留意一下浏览器兼容性的问题。

好文,socket.io更简单

ipcjs

#6 Created at ... [Delete] [Delete and Lock User]

原来是localhost和127.0.0.1不同的原因呀。。。 赞一个

BlueNeighbour

#7 Created at ... [Delete] [Delete and Lock User]

出现了和层主同样的问题,但不知道是哪里出错,看完层主的回答改了程序但还是出错,在app.jscreateWebSocketServer方法中的

wss.on('connection', function (ws) {
    let location = url.parse(ws.upgradeReq.url, true);
    ...

这句话一直报错,不知是什么原因,希望层主或廖老师能够解答 :)

拥小山

#8 Created at ... [Delete] [Delete and Lock User]

路径改成ws://${location.hostname}:3000/ws/chat 也是不行的,改成var localpath = (window.location.href).substring(6); var ws = new WebSocket('ws://'+localpath+'ws/chat');问题就解决了。这样动态的获得当前url,既可以实现内网访问,也可以实现外网访问

对于第一个问题,结合我这几天的经验来看

  • 需要删除init-db.js中的process.exit(0),原因我推测是因为前面的数据库操作会耗时,而process.exit(0)会让程序在数据库操作还未完成的时候就退出了。
  • init-db.js这个是需要手动执行的,而且执行的命令是NODE_DEV=test node init-db.js,这样就设置好了,是在test这个数据库中创建表格。

希望能帮到你。

木村落

#10 Created at ... [Delete] [Delete and Lock User]

谢谢层主,原来是localhost和127.0.0.1对应不同的cookie的问题啊,找了一个晚上的原因 -.-


  • 1
  • 2

Reply