精品 分享几道Nodejs面试题,大家一起来做,有大神回复指点
发布于 9 年前 作者 i5ting 26971 次预览 最后一次回复是 9 年前 来自 分享
实现一个简单 MySQL ORM 模块
支持类似如下的使用方法(最好包含基本的单元测试):
const orm = new MyORM({
// mysql连接信息
connection: {host: '127.0.0.1', port: 3306, user: 'root', password: '', database: 'test'},
});
orm.table('xxxx').find(query).skip(0).limit(20)
.then(list => console.log('results', list))
.catch(err => console.log(err))
orm.table('xxxxx').update(query, update)
.then(ret => console.log(ret))
.catch(err => console.log(err))
// 另外需要支持基本的 delete, findOne 等方法
实现一个简单的 Redis Session 中间件
支持类似如下的使用方法(最好包含基本的单元测试):
// 初始化中间件
app.use(mySession({
connection: {host: '127.0.0.1', port: 6379}, // Redis连接信息
maxAge: 3600, // session的有效期
sessionId: 'my.sid', // session ID 的cookie名称
}));
// 使用时直接在 req.session 上添加或删除属性即可
使用 net 模块实现一个简单的 HTTP 客户端
支持类似如下的使用方法(最好包含基本的单元测试):
request({
method: 'POST', // 请求方法
url: 'http://xxx.com', // 请求地址
qs: {a: 123, b: 456}, // query查询参数
form: {c: 111, d: 'zxxxxx'}, // post body参数
headers: {
'user-agent': 'SuperID/Node.js', // 请求头
},
})
.then(ret => {
// ret.headers 表示响应头
// ret.statusCode 表示响应代码
// ret.body 表示响应内容(Buffer)
})
.catch(err => console.log(err))
实现一个简单的测试单元框架
支持类似如下的使用方法(最好包含基本的单元测试):
// 同步功能测试
test('测试1', function () {
assert.euqal(1 + 1, 2);
});
// 异步功能测试
test('测试2', function (done) {
setTimeout(function () {
assert.equal(2 + 2, 4);
done();
}, 100);
});
执行测试后返回类似如下的结果:
测试1 - 耗时100ms - 失败
测试2 - 耗时125ms - 通过
参与方式
本帖回复答案,@leizongmin 会给出指点
老雷简介
老雷(雷宗民),一登高级后端工程师,《Node.js实战(双色)》和《Node.js实战(第2版)》作者之一,xss模块作者,5年Node.js使用经验,GitHub: leizongmin
全文完
欢迎关注我的公众号【node全栈】
联系我,更多交流
42 回复
有点高端的。。。。。。,这岂止15k+啊。。
怪不得我没过15K
我目前的能力估计只能做一下 “使用 net 模块实现一个简单的 HTTP 客户端”, 详见 这里 不过有点奇怪的是, 对于某些网站的访问, 似乎不会触发 data 事件. 比方说 http://www.baidu.com/s?wd=qwe&ie=UTF-8&tn=baidulocal, 我对比过我的模块发出的 request header 跟 curl 发出的 request header, 它们是一样的, 但是我的模块就是获取不了响应… 不知道什么原因, 恳请指点.
可能是这个导致的
http://blog.csdn.net/yankai0219/article/details/8269922 https://zh.wikipedia.org/wiki/分块传输编码#.E6.A0.BC.E5.BC.8F
connection: close 之后百度那个还是有问题,可能还是需要哪个 request header
@magicdawn 嗯 那是因为 data 事件一直没触发
另外, 我认为跟 response header 里的某个参数关系不大. 因为不论 response header 里有什么参数, 它总得先把这个 header 给我发过来吧, 但我这里的情况相当于 socket connect 之后就直接 close 了.
而且, 访问 weibo.com 的时候, response header 里也是带有 Transfer-Encoding: chunked, 不过 data 事件却有触发.
顺便附上 curl 访问 baidu 的 request header: curl -vvv ‘http://www.baidu.com/s?wd=qwe&ie=UTF-8&tn=baidulocal’
HTTP/1.1 200 OK . . .
如果使用HTTP访问百度的时候,百度会要求跳转到HTTPS的,你检查是否有正确处理301或302状态码 @knight42
@leizongmin 唔…你可以试下访问 http://www.baidu.com/s?wd=qwe&ie=UTF-8&tn=baidulocal, 应该是没有跳转的.
但我现在遇到的问题是整个响应我都没有接收到
我也写了一个,见GIST 这模块如果要上生产环境,几个小时是不够用的,要是实现request包的完整功能我就觉得好厉害了 其他几个题也很不错,跟我现在的技术栈正好匹配,今天偷懒,改天再找个时间写写看
自从老大不给我们review代码之后,很多地方都是凭感觉写,写出来莫名其妙,恳请吐槽啊@knight42
@knight42
HTTP/1.1后面多了个空格。hexdump才看到。。。
@reverland 大神啊… 很抱歉给你带来了这么大的麻烦! 万分感谢!!!
@knight42
哈哈哈,我找到你的毛病了。。。
把空格删掉试试。。。就好了。。。
@knight42 我是渣渣。。。这也是长姿势了。。
@magicdawn 。。。。。。简直醉了
1是data事件打印的,2是end打印的。。。
@reverland 哈哈~怎么dump的~求教。。。
@magicdawn @reverland 当时真的是手抖… 没想到居然是个空格的问题 Orz
@magicdawn
@ayiis 我没什么好吐槽的… 你实现的完成度高多了, 错误处理也很完善跟周到, 而且没有像我那样使用 querystring 跟 url 偷懒 Orz…
话说把另外几个题也做了吧, 我也想学习一下~
@reverland 在8000起本地server,然后等着dump,然后用问题代码去访问8000是吧?
傻傻的test
@magicdawn 用tcpdump看也行,就是。。。包太多了。。
拿scapy自己做一个专门用来检查HTTP请求的。。。
你们好厉害,看样子窝离15k太远了,还是默默地搬窝的砖。。。
@knight42
@reverland 这个轮子不好造啊… 我现在的项目正是在用python的sock_raw做这个事情… 求交流
@ayiis scapy啊。。。
@ayiis orz膜
@ayiis 不过说到raw socket,node中到socket真是异类,窝曾经想要用node写个sniffer,然后找到了别人封装到raw socket。。。
对于中级noder来说,题目都恰到好处啊。
@ayiis @knight42 接收数据触发
data事件时,把chunk添加到数组里面即可,同时判断一下,如果请求头还没有结束就在新收到的chunk里面查找\r\n\r\n,如果找到了就练同之前收到的数据一起,分离出headers和body@ayiis 你的做法效率会有点低 @knight42 你的做法是接收完了所有数据才做处理,有时候是不可行的,比如要实现对Transfer-Encoding:chunked的支持mark
配图屌爆了
完成一点,感觉上代码会占大量篇幅 给 github[https://github.com/Tonyce/15kNodeTry]
静待大神指点
做了一部分 ,汗。。总感觉err那一块处理的不是很好
加强版。ok的
@leizongmin nodejs新手,快速写出来的,求指导
嘿嘿嘿,我也来一发~~ MySQL orm ← 话说ORM不是要建模么 底层使用Promise封装,每次操作从连接池拿连接对象,开始所有数据库操作(也就是调用.table(‘table_name’)时)每次返回一个新的操作实例 _query 对象,这样就可以实现多个查询并行执行了~~ .目前的问题是当有非常多个操作发起时会生成多个操作实例,感觉上有点占内存。。。 ,每次调用前做了一次检查,每次查询必须首先调用
table()指定表,然后必须调用CRUD操作方法find();delete();update();findOne()指定此次的操作 , 最后选择性调用skip(); limit();方法做结果的筛选。实际测试完全通过。 嘛如有不足还请一定提出指正。如有不足还请指正。@leizongmin
留名关注,真是好问题!
mark From Noder
这应该是10K的面试题
@JerryC8080 1
学习一下大牛!