荣新IT培训中心
全国咨询热线:400-1335-066
您现在的位置:首页>技术文章 > 正文

面试中Node.js的小知识

时间:2017-07-28 13:17:09 来源:荣新IT教育培训 作者:荣新科技

在我们面试的过程中经常会遇到一些面试官会问些问题来以此判断我们的能力,但是有些东西并不是可以完全判定一个人的能力的。经过这些问题就来判别一个人的Node.js程度是不太严谨的,但是 它能让你对面试者在Node.js上的经历如何有个大约的理解。
 

 

但是显然,这些问题并不会通知你面试者考虑问题的方式。

Show me the code. 分离一些编程题来调查面试者吧

大家都是人,不要做一个板滞不近人情的面试官哦。

stub是什么? 举个例子?

stub是用来模仿组件/模块行为的东西,它在测试阶段为函数调用提供内部响应。

例子是写文件,但实践上并没有这么做

var fs = require('fs');

var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) {

return cb(null)

})

expect(writeFileStub).to.be.called

writeFileStub.restore();

复制代码

如何保证你的HTTP cookies平安不受XSS攻击

在 set-cookie HTTP头部加上这几个信息:

HttpOnly-这个属性用来避免跨站脚本攻击,它不允许cookie被JavaScript代码获取。

secure-这个属性通知阅读器只要在HTTPS衔接时才发送cookie

像这样: Set-Cookit: sid=; HttpOnly

下面这段代码有什么问题

new Promise((resolve, reject) => {

throw new Error('error')

}).then(console.log)

复制代码

then 后面没有跟上 catch ,这样的话假如出错的这段代码还是默默地运转,并不会通知你哪里出错了。

修正后:

new Promise((resolve, reject) => {

throw new Error('error')

}).then(console.log).catch(console.error)

复制代码

假如你正在调试一个大型项目,你不晓得哪个Promise可能会有问题,能够运用 unhandledRejection 。它会打印出一切未经处置的Promise异常

process.on('unhandledRejection', (err) => {

console.log(err)

})

复制代码

下面的代码有什么问题?

function checkApiKey(apiKeyFromDb, apiKeyReceived) {

if (apiKeyFromDb === apiKeyReceived) {

return true

}

return false

}

复制代码

说实话我刚看到的时分也是一脸懵逼,这有啥问题?不是很正常的一个if else代码吗。

不过这不是普通的if else代码,这是用来比拟平安证书的代码,这个时分你不能泄露一丁点的信息,所以确保他们在一定的时间内停止比拟。否则的你的应用就可能遭到时序攻击了。

什么是时序攻击( timing attacks )?Node.js运用的V8引擎试图从表示层面上优化代码。它一个字符一个字符地比拟,一旦找到不契合它就中止比拟。

你能够运用 cryptiles 这个npm模块来处理这个问题

function checkApiKey(apiKeyFromDb, apiKeyReceived) {

return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)

}

复制代码

某乎上有个解释地挺好的 如何浅显地解释时序攻击(timing attack)?

什么是error-first的回调方式

Error-first回调方式用来同时传送error和data。将错误作为第一个参数,它就必需先检查看看有没有错误先。另外的参数就用来传送data了。

fs.readFile(filePath, function(err, data) {

if(err) {

//处置错误,这里的return很重要,假如发作错误,在此处就会中止了。

return console.log(err);

}

//传送data

console.log(data);

})

复制代码

你是如何防止回调天堂的?

模块化把回调函数分割成独立的函数

运用 控制流的库 ,比方 async

generators分离Promise

async/await

Promise是什么?

概念不多说了,简单来说就是协助你更好地处置异步操作的东西。

new Promise((resolve, reject) => {

setTimeout(() => {

resolve('result');

}, 100)

})

.then(console.log)

.catch(console.error)

复制代码

下面的代码会输出什么

Promise.reso(1)

.then((x) => x + 1)

.then((x) => {throw new Error('My Error')})

.catch(() => 1)

.then((x) => x + 1)

.then((x) => console.log(x))

.catch(console.error)

复制代码

一个新的Promise被发明出来,它会解析参数1

解析后的值会被加上1(如今是2),并立刻返回了这个2

解析的值被丢弃,抛出一个异常

异常被丢弃,新的值1被返回   》》》有不懂的地方?随时咨询在线导师为你解疑答惑

catch后运转不会中止,在异常处置之前,它继续运转,一个新的,增加了1后的值2被返回

返回值被打印出来

这一行不会运转,由于没有异常
荣新推荐阅读:浅谈web培训之web前端开发入门基础

有没有学到一些小知识呢?掌握了这些小知识会让我们工作和面试变得更轻松,学无止境,让我们在成功的道路上一起努力,荣新伴你一路成长。