Node.js 开发实践直播专用贴

关于《Node.js 开发实践》直播对应的帖子,有关直播相关的资源可以在这里找到。相关的问题、意见和建议都可以在这里反馈。

第一期:Node.js 介绍和异步风格

时间: 2016 年 12 月 07 日 17 点
简介:JavaScript 和 Node.js 的基本介绍和优劣,再介绍下 Node.js 和很多其它语言的一个显著区别:异步编程方式,以及简单介绍异步编程的异常处理。
胶片:Node.js 介绍和异步风格.zip (33.0 KB)
视频回放: https://v.douyu.com/show/p2V0JMVwlAWRY5kq

第二期:NPM 包管理器

时间: 2016 年 12 月 12 日 17 点
简介:NPM 是 Node.js 御用的包管理器,我们将介绍如何基本的使用,有哪些开发期的功能和小技巧,最后还会介绍下 NPM 为了减少依赖包体积做的一些优化。
胶片:NPM 包管理器.zip (19.0 KB)
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_1.html

第三期:开发工具介绍:curl, Postman, lean-cli

时间: 2016 年 12 月 14 日 周三 17 点
简介:本期介绍一些在开发时能有效提供效率的工具(命令):

  • curl: 命令行的 http client,快速调试各种 REST API,或者确认 web 服务的有效性。
  • Postman:比较强大的图形化 http client,能系统化的管理 http request。
  • lean-cli: LeanCloud 的云引擎命令行工具,介绍下新老版本的主要区别,常用的功能,推荐的开发流程等。

很抱歉,Promise 的部分先顺延,因为希望大家先把一些周边工具搞定了,写代码效率会好一些。

胶片: 开发工具介绍 curl postman lean-cli.zip (54.3 KB)
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_2.html

第四期:Promise

时间: 2016 年 12 月 16 日 周五 17 点
简介:本期介绍 Promise,能一定程度降低 Node.js 的回调噩梦,对于异常处理也有较好的体验。而且 Promise 是趋势,快快学起来吧~。
胶片: Promise.zip (17.2 KB)
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_3.html

第五期:云函数调试页面的使用

时间: 2016 年 12 月 19 日 周一 17 点
简介: 云引擎命令行工具提供了 localhost:3001 的调试页面,但是很多同学反馈不怎么好(会)用,本期我们一起尝试下调试页面,并收集下大家的意见和建议。
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_4.html

第六期:使用 mocha 编写测试

时间: 2016 年 12 月 21 日 周三 17 点
简介: 没有测试保证的代码运行起来总是心里没底,从这期开始我们将介绍关于 Node.js 测试相关的工具或类库。首先介绍 mocha。
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_5.html

第七期:使用 Express 开发 web 项目

时间: 2016 年 12 月 23 日 周五 17 点
简介: 使用 Node.js 开发 web 项目,Express 是一个不错的选择,它是一个简单有效的 web 框架。我们将学习 Express 的主要功能:定义路由,定义中间件,错误处理等,还会介绍 LeanEngine Node SDK 如何嵌入 Express 框架。
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_6.html

第八期: Redis 和 LeanCache 的介绍和场景举例

时间: 2016 年 12 月 26 日 周一 17 点
简介: 有些移动端工程师对于 Redis 了解不多,所以我们本期介绍下 Redis —— 一个高速的 KV 存储,而 LeanCache 是一个 Redis 的服务,为云引擎提供高速缓存,我们也会介绍下如何使用 LeanCache,以及一些常用的场景示例。
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_7.html

第九期: 工具类库:eslint,rewire,muk,joi

时间: 2016 年 12 月 26 日 周三 17 点
简介: 本期我们介绍下 Node.js 开发过程中常用的工具类库:
* eslint 静态代码检查工具;
* rewire 测试时的利器,可以临时修改内部变量方便测试。
* muk 一个简单的 mock 类库。
* joi 一个功能强大的参数校验类库。
直播地址: http://live.bilibili.com/1568903
回放地址: http://www.bilibili.com/video/av7503722/index_8.html

第十期: 云引擎容量规划

时间: 2017 年 01 月 04 日 周三 17 点
简介: 主要内容:

  • 了解云引擎控制台和存储服务控制台各项统计的意义。
  • 了解并能测试云引擎应用基准性能。
  • 预估云引擎实例规格的容量,合理分配云引擎实例规格。

回放地址: http://www.bilibili.com/video/av7851205/

11 人赞了这个帖子.

我是一名前端程序员,之前用你们云引擎在线编辑写了数十个商业项目了。现在想转部署那种方式,是不是学nodejs成本最小呢?能不能提点一下学习内容的顺序和需要用到的软件?(貌似有我这个需求的人挺多的,群里好多用在线编辑的前端小伙伴了。。)

POSTMAN用来调试云函数,简直棒。希望推荐更多好用的开发工具。

本主题已全局置顶,它将始终显示在它所属分类的顶部。可由职员对所有人解除置顶,或者由用户自己取消置顶。

希望有时间能讲下leancache,目前leancahe的文档里,使用方法(怎么存,怎么取)都没有讲,只说让我们自己看范例,但github上的范例是有bug的,跑起来有问题。如果能现场讲解一个简单的例子就好了。

我最近也在用leancache。因为leancache实际上就是redis,所以很多相关的操作命令文档可以直接看redis的。
http://www.redis.cn/

好的,谢谢,我仔细学习下。我看了leancloud的示例项目代码,看不懂怎么set或者get操作leancache的值,所以有些晕乎。如果文档写的详细点,给一小段代码贴出来就好了。

set和get是最简单的操作了。
set(key,value)
get(key)
就可以了。

示例项目代码使用了bluebird实现promise规范
接口变成了getAsync和setAsync。后面接then后的操作结果。

可以来一场关于 Redis 和 LeanCache 的介绍~谢谢反馈。

很棒!已经推荐给另外个同事也在跟这个系列的直播了!昨天说的redis部分,想请教下,如果是一个结构比较复杂的对象,常用的做法是不是json.stringify成字符串后再存,这么干的?

可以这么做,取出来的时候在 JSON.parse() 一下。
也可以尝试自己序列化,比如把对象自己整理成类似于 key1=value1&key2=value2 的样子,不过自己需要做一些转移什么的,反序列化过程也需要自己写,甚至有可能出错。所以简单有效的办法就是用 json。

关于expree 中间件有一个问题请教

我想在云函数被调用之前,统一对传入云函数的参数request里面的params添加一些数据,类似leancloud向request里面增加sessionToken这些数据。

如果要让我新加入的这个中间件执行,则必须在app.use(AV.express());这句话之前app.use(myfunction());

但是这个时候的bodyparser和cookieparse都在app.use(AV.express())之后。

我又尝试把bodyparser和cookieparse放在我的中间件之前调用。但是发现好像解析出来的body和云函数那边接收到的request.paramse并不是一个对象?

这种情况应该怎么处理?

毕业前在学校做个人项目的时候就开始使用LeanCloud了,那时还不知道云引擎.工作后公司项目依然使用LeanCloud,只不过这回还使用到了云引擎.作为移动端开发人员,当时觉得python比较好上手,于是云引擎代码也使用python编写了.随着一段时间的使用,现在发现python的SDK对于所有一些特性的支持不是很全,而JS的SDK文档却相对完备.于是打算迁移到Node环境,一直以来都有这个想法,奈何网上的Node教程似乎质量都不是很高.直到偶然看到这个帖子的视频,看了几节课下来,受益匪浅.老师虽然很喜欢嘴边挂着"尴尬"二字,但是讲课过程却十分自然,并且结合LeanCloud已有的产品.比其他教学视频不知道高到哪里去了.相信看完之后我们迁移到Node环境的云引擎也会跑的比Python还快! 非常感谢!

顺带提一个小问题,之前也尝试使用过node的环境,但是同样的最低配0.5U 256M 专业版实例,python环境只占用50M左右内存,而同等条件下,node环境则直接120M以上,请问这是正常情况吗?如果切换至Node环境,是否需要考虑升级实例的规格呢?

我觉得只要内存没有使用占比过高(比如70%以上)或者持续升高。稳定在120MB左右没有必要升级实例规格。如果不够用了,leancloud会在日志里面输出报警信息的。那个时候升级就可以了。

嗯 好的 谢谢

但是这个时候的bodyparser和cookieparse都在app.use(AV.express())之后。

app.use(AV.express()); 放在 bodyparser 等中间件之后的原因:云函数请求是不需要 cookie 的,所以 cookie parser 放在后面可以减少一层中间件调用,理论上性能好一点点(虽然可以忽略不计);云引擎中间件自带 body parser https://github.com/leancloud/leanengine-node-sdk/blob/master/lib/leanengine.js#L85-L87 原因是有可能开发者自己启动的 webServer 不会明确的加载 body parser,所以云引擎中间件需要能完全自给自足。所以,云引擎中间件在最前面加载,避免其他中间件的干扰,并且自带所有需要的插件来解析请求。

我想在云函数被调用之前,统一对传入云函数的参数request里面的params添加一些数据

不太明白这个使用场景,原则上我们希望:云函数和 webHosting 两套东西尽量隔离,只是因为都是 webService,为了资源共用才部署在一起。其实我们是有想法让云函数完全独立运行,因为对于很多开发者来说,云函数 和 webHosting 有不一样的优先级,或者不希望两个混用相互影响。
甚至有可能以后云函数为了性能考虑,不走 http 请求和 json 序列化也说不定。
在云函数中间件前面自定义一些变量,在云函数里面应该也获取不到,除非改变云函数中间件,把自己的变量提出来。
所以,我们建议尽量不要在云函数前面再增加自定义的函数。

但是发现好像解析出来的body和云函数那边接收到的request.paramse并不是一个对象?

也许是 body parser 这类中间件重复解析带来的影响,不过我还不确认,如果要排查可能需要具体跟踪下。

这是正常的,Python 内存占用是比 Node.js 低。使用我们的示例项目(几乎是最简单的应用了)启动后会占用 100+MB,访问频繁应该也在 200MB 以下。
如果觉得 Node.js 内存占用多,你可以尝试下 Java 运行环境,示例项目启动就 300MB,随便用用就 800MB 了~
当然,每个运行环境的运行效率也是不一样的,有得有失。

我觉得只要内存没有使用占比过高(比如70%以上)或者持续升高。稳定在120MB左右没有必要升级实例规格。如果不够用了,leancloud会在日志里面输出报警信息的。那个时候升级就可以了。

正解~

谢谢,既然希望webServer和云函数是完全隔离的,那我就换个思路来做了。

以前对express这个框架不了解,看了你的视频学习了后。只是在做一些测试 smile,看一些东西能不能如想的那样实现。

不太明白这个使用场景,原则上我们希望:云函数和 webHosting 两套东西尽量隔离,只是因为都是 webService,为了资源共用才部署在一起。其实我们是有想法让云函数完全独立运行,因为对于很多开发者来说,云函数 和 webHosting 有不一样的优先级,或者不希望两个混用相互影响。
甚至有可能以后云函数为了性能考虑,不走 http 请求和 json 序列化也说不定。
在云函数中间件前面自定义一些变量,在云函数里面应该也获取不到,除非改变云函数中间件,把自己的变量提出来。
所以,我们建议尽量不要在云函数前面再增加自定义的函数。

我的目的是想在所有云函数被调用前,通过解析request header等一些数据,得出玩家是从哪个国家发出的请求。然后把这个国家信息传到request.params里面。当然如果不能通过中间件执行,我就只能写一个通用解析函数,然后在需要使用国家信息的云函数里面,首先调用下这个解析函数。

还在消化redis那节课,我研究范例代码,发现使用redis的地方都用var Q = require('q')这个来生成Promise,这个是不是常用的做法?redis操作本身不是promise对吧。我不用Q,直接用Promise或者bluebird应该也可以吧?

发现使用redis的地方都用var Q = require('q')这个来生成Promise,这个是不是常用的做法?

可以使用 Q 来包装 redis 的操作,不过相比 bluebird 的 promisifyAll 方法来说有点麻烦。

redis操作本身不是promise对吧

这要看 redis client 的库如何实现,比如 https://www.npmjs.com/package/redis 这个的 api 风格就不是 Promise 的,而 https://www.npmjs.com/package/ioredis 这个库的 api 就是 Promise 的,可以根据需要自己选择。

我不用Q,直接用Promise或者bluebird应该也可以吧?

比较推荐的办法是使用 bluebird 的 promisifyAll 方法封装 https://www.npmjs.com/package/redis 这个库,具体做法在 https://www.npmjs.com/package/redis#promises 有介绍。我们的实例项目就是这样做的:

  1. 将 redis 的主要 api 包装下,示例代码 https://github.com/leancloud/lean-cache-demos/blob/master/redis.js#L5-L6
  2. 所有 api 后面增加 Async 就可以得到 Promise 风格的 api,示例代码 https://github.com/leancloud/lean-cache-demos/blob/master/routes/captcha.js#L31

感谢楼主的解答,redis那块基本了解,自己也跑通了一些基本的东西。关于Promis那块想再问一下,现在支持async/await吗?我看讲Promise视频的时候好像也没提到这个

这样的话推荐 ioredis 这个库,完整支持 Promise,API 和 node-redis 差不太多。

马克下,现在开始跟了

第一期播放不了了。。。

我看了下还可以。。。麻烦再试试看。

本主题已被解除置顶,它将不再显示在它所属分类的顶部。

两个晚上~我把这个全部看完了~~ stuck_out_tongue_closed_eyes挺有用的