您的位置:首页 > Web前端 > Node.js

小丸子总结node.js的一些问题

2016-08-10 19:06 555 查看
原谅我的node.js功底还很弱。

1.什么是错误优先的回调函数?

设计一个回调函数的时候,第一个参数是err,用于优先解决错误,后面再传递参数。

fs.readFile(filePath, function(err, data) {
if (err) {
//handle the error
}
// use the data object
});


2.如何避免回调地狱?

可以使用promise

可以使用q的库实现promise或者同步

之前的工大淘APP实现的时候砽的是promise。

3.如何用Node来监听80端口?

只有超级用户权限才可以监听80用户端口,普通用户权限减一还是监听1024以上端口吧。

网上的大大说:

目前,如果你一定要让你的应用监听80端口的话,你可以有通过在Node应用的前方再增加一层反向代理 (例如nginx)来实现,如下图所示。否则,建议你直接监听大于1024的端口。

nginx在domeos项目的时候使用过啦。代理服务器来接受请求,分发给内网上的服务器。

4.什么是事件循环?

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

看完感觉之前太稚嫩了。、

5.哪些工具可以用来保证一致的编程风格?

JSLint

ESLint

自己的代码出错了可以检查到

7.使用NPM有哪些好处?

管理依赖

8.什么是stub?举个使用场景?

大大说:

在单元测试中:Stub是完全模拟一个外部依赖,而Mock常用来判断测试通过还是失败。

9.什么是测试金字塔?对于HTTP API,如何利用测试金字塔?

大大说:

 测试金字塔指的是: 当我们在编写测试用例时,底层的单元测试应该远比上层的端到端测试要多

我还从来没有测试过。

10.你最喜欢的HTTP框架,并说明原因?

express。因为只用过这一个。

11.你觉得 Node.js 与PHP比较,在做一个博客网站,你觉得谁更适合,又为什么?

node.js特点

单线程(并发数大)

事件驱动

异步IO (虽然这会产生很多困扰)

jsV8 引擎 ,执行速度快

这样的话,node.js就比较适合 实时交互(并发多,速度快) & 数据量很小的交互(避免阻塞) &后台数据处理逻辑简单(后台处理很久,会阻塞)

博客系统还是很符合的。

大二的时候使用PHP开发过一个电商管理系统,当时实现的时候也是模拟了一个路由界面(相当于MVC中的controller层),但是还是觉得逻辑上有些混乱。

今年用node.js写工大淘的时候,使用express框架,感觉田生就是以路由为中心的。写起来逻辑很清晰。

node.js还适合做中间件,接受http请求,转发给真正的服务器。利用了它强大的并发能力和路由。

如果后台计算量特别大等CPU密集业务,还是交给php来实现吧。

12.你觉得异步编程会带来哪些困扰,那异步代码又有哪些优点?

的确遇到了很多困扰,之前的博客中也提到过解决方法之类的。

我曾经在群里问大大:如何在node.js中实现同步。

大大说:node.js本身就是异步的,这是它的特点,你要倒行逆施吗。

我才明白,我用类库,来限制node.js下的所有任务都同步执行,那我用node.js是干什么呢?我直接使用php不就好了。

后来发现,在node.js中有一两层嵌套还是可以忍受的,然后使用promise来限制一些逻辑。放弃使用同步流程控制。

13. Node.js的模块包管理require的使用,exports与module.exports之前区别与联系。

之前一直这么用:

导出

exports.name = function() {
console.log('My name is Lemmy Kilmister');
};


引用

var rocker = require('./rocker.js');
rocker.name(); // 'My name is Lemmy Kilmister'


其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports。

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

修改rocker.js如下:

module.exports = 'ROCK IT!';
exports.name = function() { console.log('My name is Lemmy Kilmister'); };


再次引用执行rocker.js

var rocker = require('./rocker.js');
rocker.name(); // TypeError: Object ROCK IT! has no method 'name'


报错

如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。

所以说如果使用Module.exports的话,就必须是特定的类型了。那还是算了吧。

推荐使用 exports。

14.你了解Node.js的内存泄漏吗?

回调函数没有执行完毕,一直留在人物队列的时候,就形成闭包,内部的数据就一直占有内存。如果数据多了,会产生内存泄漏!

这里有工具可以检测。内存泄露定位工具。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 node.js 对象 设计