Ask me anything in 《狼叔爱Node》
发布于 3 年前 作者 i5ting 4515 次浏览 来自 分享

Ask me anything in 《狼叔爱Node》

2017-02-24

回复内容

问题1

在一家创业公司实习,承担了比普通公司更多的职责和工作,但是我认为这种情况不应该持续下去。创业公司要向正规化的公司发展,必须要形成一个工程体系。产品不应该以需要跑业务为由而只留下一个只有概念的需求。现在技术团队已经完善了自己的技术体系。但是产品给出的需求依然只是一个概念性的东西。并且依然不做出改变。我学的是软件工程,我理解的工程是以团队为主题,每个人有自己的职责,工作流程十分清晰,输入输出十分明确,团队目标十分清楚,这样才能高效的运转,创业公司人少没办法,但是不应该在原地踏步,应该积极的向工程化团队的目标发展。在大公司工作的你们产品,设计,开发之间的关系是怎么样的?👀👀

问题2

nodejs如果只做后端开发的话,该如何在这条路上走的更远更好? 我本人不太喜欢搞前端开发,只想在后端发展。

问题3

狼叔,您好。后端我只用过express + mongoose,想深入了解node.js后端,有什么源码demo可以推荐吗?😊

问题4

狼叔你好,我之前跟着你的教程学的nodejs,受益匪浅。现在基本的语法都会了,也自己做了些留言板、博客之类的小网站。但是现在遇到了瓶颈,遇到大项目就不知从何下手。希望狼叔指点迷津~谢谢狼叔

2017-02-27

回复内容

问题1

狼叔您好。我是一名雷达工程师,想做一个类似flightradar24的网站。现在雷达数据输出接口有网口和串口。请问这样的网站前后端怎么设计,数据怎么接入和存储?谢谢啦

再稍微详细点,前端要啥,后端能给啥,大致的流程是啥,晚点统一回复

前端实现飞机位置在地图上的实时显示,后端能提供雷达数据接口(网口或串口),接口实时输出飞机的位置高度速度等信息。总体上想做成flightradar24这个网站的样子。但是由于我之前是学硬件的,只学了一点网站的基础javascript ,html,node。还请狼叔多多指教

问题2

我是做php开发,在工作过程中,一直都是做业务逻辑开发。对于加载速度、并发,不是很了解。想请教一下node中是否也需要了解并发问题?会因为node是单线程 异步模式,就不需要了吗?

问题3

狼叔,我想问下,业务订单超时未付款自动关闭,一般是如何实现的?

如果想提问,请加入《狼叔爱Node》群,有问必答

互相尊重,坦诚,不说没用的

https://github.com/i5ting/ama

21 回复

狼叔很实在

对最后一个问题比较感兴趣

@zsea 那就先放出来

问题3

狼叔,我想问下,业务订单超时未付款自动关闭,一般是如何实现的?


1)从存储层处理

从mongodb 2.2开始,MongoDB又引入TTL(time to live)概念,通过给collection增加ttl索引来实现,参见https://docs.mongodb.com/manual/tutorial/expire-data/

如果你看过mongodb node版本的session肯定会知道ttl的,session也是要超时的,哈哈

另一个非常常用的缓存redis里,也有ttl和expire概念,详见https://redis.io/commands/ttl。比如ioredis里

client.expire(‘some key’, 3);

总结:一般在NoSQL层处理超时,是最简单的办法

2)通过MQ消息队列处理

将系统进行拆分,缓存层按照上面的办法处理超时,同时以MQ的形式,向后台发送一条更新订单状态的通知。

  • 缓存层处理超时,向后台订单服务发送一条更新订单状态的通知
  • 后台订单服务接收到更新订单状态的通知
  • 后台订单服务更新订单状态

当然,还有很多其他办法,大家可以多开动脑筋想想。

不会前端的Node.js 开发路过

2017-02-24中的Q1和Q2,回答的还是非常中肯的,聪明人问的应该是思路而不是具体的细节问题

2017-03-02

回复内容

问题1

狼叔您好,本人刚毕业半年,有将近一年的node.js开发经验,最近准备去参加node.js面试的,我想问一下node.js面试中,面试官最喜欢问哪几类的问题,有哪一些"雷区"是不能踩的,请狼叔指明一条明路,不胜感激~~ 晚点统一回复

问题2

狼叔,我在用idea 的debug模式时,报端口监听错误。代码里起了子进程,没让子进程监听端口。是不是idea的debug工具会让进程监听端口?

问题3

狼叔可否聊一下测试的前世今生。为什么代码总要包含测试的部分?最近在学习promise的知识,其中有一章专门讲使用mocha进行promise测试。感觉不太理解,您是否可以形象的说一说呢

更新,有人说webstorm没有问题,可能是某些版本吧

https://www.zhihu.com/question/42195778/answer/102689583 https://www.zhihu.com/question/34562777

围观,支持

已经95人了,最后5个99名额,之后就回复199了,哈哈

2017-03-06

详细回复

问题1

桑大 问个问题 如果后台用python或者java专门提供数据 node如何去调用

问题2

狼叔,最近李笑来的线上八周全栈班要开课,但是以rubyonrails为主。您可以比较一下和node的区别吗?如果报这个班,对全栈学习有多大帮助呢?我在google trend看rubyonrails在走下坡 可以写,不过会打起来😂

问题3

继续请教狼叔关于flightradar24的问题,我现在通过wireshark可以读取雷达数据服务器输出的udp包雷达数据,并且在github找到了数据格式asterix parse的一个python的代码https://github.com/CroatiaControlLtd/asterix,麻烦狼叔帮忙看一下如何改用node实现,您给理个思路。还想请教狼叔读取文件的问题,我只会用fs模块读取文件,如何从网络读取或是从标准输入(比如电脑串口)读取,能可否推荐相关书籍或文章,不胜感激

问题4

每次看github的代码都觉得一头雾水,不知怎么下手,请教各位大神们,你们是怎么阅读github里面代码的呢

不仅要和狼叔学代码,还要学营销…… 突然想到,要是有个人天天给狼叔提交一点bug,怎么解决,狼叔会不会烦死。

作为cnode一直以来的潜水党,加入圈子表示支持一下。

2017-03-09

统一回复

问题1

如下代码实现了一个使用mocha来检测是否返回了一个用户的测试用例const request = require(‘supertest’)describe(‘GET /user/:id’, function() { it(‘returns a user’, function() { return request(app) .get(’/user’) .set(‘Accept’, ‘application/json’) .expect(200, { name: ‘John Math’ }, done) })})

上面写的测试用例,不知道意义何在。我觉得是,真正需要测试的大都是业务逻辑,比如游戏核心玩法算法这些,写个测试用例有很大的意义,可以验证算法是否正确。

问题2

请问狼叔,现在node项目的代码使用ES6标准写还是用以前的?

问题3

狼叔每天可否出几道思考题,这样能够指引大家慢慢覆盖node的知识点。之前的那一次就非常棒

问题4

狼叔,对于用node 写手游服务器端,你有什么看法?或者有没有接触过的人,用node 在写服务器端的?

问题5

mongo不支持事务,狼叔有什么推荐的解决方案吗?

问题6

一直有个疑惑,可能没有太在意。 今天想问下狼叔。大家都在说node.js的事件驱动,异步IO,概念都能倒背入流了,却依然没有掌握到精髓所在。 我的疑问在图片里,请狼叔解答。

/**

  • 疑问:
  • 单机运行情况下
  • 1: 并发请求过来的时候, 比如说req1, req2 ,是否这两个请求的func3 是按什么顺序注册到事件队列中的?
  • 2: 是否会因为并发,导致redis数据混乱? 我觉得应该会,io异步导致
  • 3: 所谓的单线程,是否就真的没有锁,同步的烦恼? */

2017-03-16

统一回复

问题0

我基础知识不行,之前有js基础,然后看了一下node就开始写项目,边做项目边查资料,只是能把功能实现,理论知识欠缺,如果想补一下该看什么呢@i5ting 。求狼叔点拨一二

问题1

狼叔,您好!我想请问应届生找node.js实习工作难吗?没有经验简历应该怎么写?希望您能提供点思路给新人,谢谢!

问题2

这几天去面试了一些nodejs职位,被问得最多同时也是最基本的问题就是:你平时写node有没有什么经验心得。。狼叔请原谅我这个刚毕业没多久的node菜鸟,对于这一块确实没有累积到什么经验,所以想问一下,狼叔你们在开发nodejs项目的时候,最常遇到什么问题,如何去解决的,谢谢~

问题3

请教大家,在使用formidable模块的时候,我发现如果在当前上传表单中并没有上传文件,那么在执行到form.parse()的时候会默认保存一个大小为0字节的空文件,请教该怎么避免这个问题?

问题4

狼叔,今天遇到一个问题,关于NodeJS能开辟多少个子进程的问题。具体场景:利用子进程来处理socket.io请求,想提高cpu的利用率,不知道开多少个子进程比较合适,目前是按照os.cpus().length来开辟的,但是不知是否能够重复利用cpu。最好的方法是重现真是的生产环境,然后根据cpu的使用情况来确定开辟的子进程数,但是这不现实。请狼叔指点一下,谢谢。

问题5

前段时间在V2看到TB的吐(招)槽(聘)贴,后来狼叔也在CNode整理了一番,但后期看到TB的严大回复“我们希望能招募到更多的应届生或工作一两年的后端新人”,当然,另一层意思是,3年左右的“老油条”第一成本不划算,第二我们的业务新人就搞得定,所以就不需要了;这让我有些困惑,最近由于公司这边的动荡才让我有了观望的想法,公司拖欠半月左右工资,从16年下半年开始已经有3次了,个人属于那种比较老实的那种,踏实干活、关注技术走向,不太感冒管理层的勾心斗角,但是感觉基本工资都不能保障,没有安全感;总结下:本人14年毕业就在这家公司,先后负责及时聊天、推送、微信服务号开发,到现在为止由于某些原因,想听下狼叔,关于“深度要扎实,适当的加点管理,尝试帮你的领导多分担活”这部分的详解。相信对于后端Nodejs走了3年左右的人来说是一个共性问题了。 Ps:本人专业是计科(嵌入式方向),但由于刚毕业发现走硬件道路没有软件机会多,所以就投身到软件开发的队伍中了,Linux系统玩的很溜,甚至做过linux系统的裁剪和移植,所以才选择走后端而非前端,16年一段时间曾经做过一些简单前端开发,也做过php重构,但还是喜欢Nodejs,个人理念是不同需求、场景需要不同技术、语言,各个语言都有其擅长的地方和不灵的地方,不排斥java和php,能够灵活切换思维如果有需要的话;

问题6

0 var request = require("request");
    1
    2 var url = "http://localhost:3000/testRedisLock";
    3
    4 for(let i = 0 ; i < 10; i++){
    5   requestServer(i);
    6 }
    7
    8 function requestServer(index){
    9   request.post({
   10     url:  url,
   11     form: {
   12       index:  index,
   13       time: Date.now()
   14     }
   15   }, function(err){
   16   });
   17 }


function testRedisLock(req,res) {
    //测试redis原子性的分布式锁
    console.log('time-start: ', req.body.time);
    var jackPotDiamond = 0;
    var autoFillTimes = 0;
    var fillDiamond = 10;

    var log = {
        index:  req.body.index,
        time:   req.body.time,
        step    :   0
    };

    async.waterfall([
        function (cb) {
            redisUtil.getRedisData(POT_KEY, function (err,data) {
                if(!err && !!data){
                    jackPotDiamond = parseInt(data);
                }
                cb(err);
            });
        },
        function (cb) {
            log.oldJackPotDiamond = jackPotDiamond;
            jackPotDiamond += 10;
            log.jackPotDiamond = jackPotDiamond;
            redisUtil.setRedisData(POT_KEY, fillDiamond, function (err) {
                if(!!err){
                    log.step = 1;
                }
                cb(err);
            });
        },
        function (cb) {
            redisUtil.getRedisData(AUTO_FILL_TIMES, function (err,data) {
                if(!err && !!data){
                    autoFillTimes = parseInt(data);
                }
                cb(err);
            });
        },
        function (cb) {
            log.oldAutoFillTimes = autoFillTimes;
            autoFillTimes += 1;
            log.autoFillTimes = autoFillTimes;
            redisUtil.setRedisData(AUTO_FILL_TIMES, autoFillTimes, function (err) {
                if(!!err){
                    log.step = 2;
                }
                cb(err);
            });
        },
        function (cb) {
            redisUtil.INCRBY(AUTO_FILL_DIAMOND, fillDiamond, function (err) {
                if(!!err){
                    log.step = 3;
                }
                cb(err);
            });
        }
    ],function (err) {
        if(!!err){
            log.error = err;
        }
        console.log('autoFillJackPot: ', req.body.time,log);
        return res.send({info : log});
    });

for 循环执行了100次, 然而结果确实
autoFillJackPot:  1489131722216 { index: '93',
 time: '1489131722216',
 step: 0,
 oldJackPotDiamond: 0,
 jackPotDiamond: 10,
 oldAutoFillTimes: 0,
    autoFillTimes: 1 
}
除了index是递增的,redis拿到的数据以及更新的数据 都跟第一次执行结果一致。

我的理解就是,当大量的并发请求到服务器的时候,redis是需要加锁的,否则,数据就会出现错误。
虽然redis单个操作是具有原子性的也只是对一个操作具有原子性,不是对请求处理过程具有原子性。

问题7

狼叔,为什么写测试用例的时候要一条一条的写,而不是 按照功能模块一块撸了。

2017-03-21

回复内容

问题6

狼叔 我有个可能不太成熟的心理 觉得现在前端圈有个很怪异的现象,大家都用github分享些自己的项目 当去看了对方的项目后,发现其实功能很简单,但是项目里却用了很多的库 每个库依赖的库又有好几个,想想也是浪费。

有时候在cnodejs上看些内容真的很不自在,看到一个项目想去研究下,想看看别人的思路,结果核心部分一堆库的调用,很希望看到的是大家都有自己的想法,而不是每次都是推荐库,感觉大家都要被各种库剥夺自己了

学些都是先散的点,然后放到一起。比如练字,刚开始都是单个字,后面才是谋篇布局、章法类的。所以上来就写,肯定是特别难得。

对于开源项目也是一样的,所以理解了上面的原理,其实你就可以非常简单的逆推了。先把package.json的里的每个模块都玩明白了。然后再玩拼起来的,就会比较容易一些。避免上来大而全,对新手不利。

最小化是学习最好的方法。能够从复杂的项目里扒出有用的东西,更是本事。加油

问题1

请教一下 狼叔 node作为后台为app提供接口的过程中,出现内存泄漏的问题,如何处理?我理解的是如果是客户端会有浏览器进行处理了,那服务器端如何处理?

问题2

async/await和promise的问题

1,现在是promiseA+规范,但我不清楚node.js原生promise是怎么实现的?是通过emit还是setTimeout,还是process.nextTick实现的? 2,async/await的本质是generator吗?是generator的语法糖吗?如何理解async/await和promise的关系? 3,第三方bluebird或Q包,他们实现promise的方式和原生promise是一样的吗? 还望狼叔解疑一下,最近这块有点疑问。。。

问题3

请教狼叔怎么用vscode进行node调试,有两个问题:

  • 1、图片中的第二个断点一直走不进去,第一个断点可以,是我的方式不对还是说这是因为node异步的原因?
  • 2、用vscode调试怎么进行post调试,比如提交表单数据,也就是怎么能和网页操作挂钩,比如像ASP.NET那样?

问题4

狼叔,请问这种方式exports是什么意思,特别是这部分 (function (Base62) {}({}));

code:
module.exports = (function (Base62) {
    var DEFAULT_CHARACTER_SET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    Base62.encode = function(integer){
        if (integer === 0) {return '0';}
        var s = '';
        while (integer > 0) {
            s = Base62.characterSet[integer % 62] + s;
            integer = Math.floor(integer/62);
        }
        return s;
    };

    Base62.decode = function(base62String){
        var val = 0, base62Chars = base62String.split("").reverse();
        base62Chars.forEach(function(character, index){
            val += Base62.characterSet.indexOf(character) * Math.pow(62, index);
        });
        return val;
    };

    Base62.setCharacterSet = function(chars) {
        var arrayOfChars = chars.split(""), uniqueCharacters = [];

        if(arrayOfChars.length != 62) throw Error("You must supply 62 characters");

        arrayOfChars.forEach(function(char){
            if(!~uniqueCharacters.indexOf(char)) uniqueCharacters.push(char);
        });

        if(uniqueCharacters.length != 62) throw Error("You must use unique characters.");

        Base62.characterSet = arrayOfChars;
    };

    Base62.setCharacterSet(DEFAULT_CHARACTER_SET);
    return Base62;
}({}));

问题5

狼叔,更了不起的Node4这本快点大概什么时候能出呀,好想买一波。。。。

月底会公测,大家参与吧

您之前是不是发不过招聘社区管理员的帖子

@nunuji123 是Node全栈公众号的运营

具体是做什么的呢 如果我可以的话 希望为社区做点贡献

@nunuji123 微信号给我,我加你

回到顶部