一些说法通过这几道题来判断一个人的Node.js水平不是很严谨,但是可以大致了解面试官对Node.js的理解程度。但显然,这些问题并不能告诉你面试官思考问题的方式。给我看代码。结合一些编程题考考面试官。人都是人,不要做死板无理的面试官。错误优先回调方法是什么?Error-first回调方法用于同时传输错误和数据。以错误作为第一个参数,它必须首先检查是否有错误。其他参数用于传递数据。fs.readFile(filePath,function(err,data){if(err){//处理错误,这里的return很重要,如果出现错误,就停在这里。returnconsole.log(err);}//Passdataconsole.log(data);})你如何避免回调地狱?模块化将回调函数拆分成独立的函数,并使用控制流库,例如asyncgenerators结合Promise。什么是异步/awaitPromise?概念就不多说了吧,简单的说,就是帮助你更好的处理异步操作的东西。newPromise((resolve,reject)=>{setTimeout(()=>{resolve('result');},100)}).then(console.log).catch(console.error)存根是什么?一个例子?存根是用来模拟组件/模块行为的东西,它在测试阶段提供对函数调用的内部响应。这个例子是写一个文件,但它实际上并没有这样做varfs=require('fs');varwriteFileStub=sinon.stub(fs,'writeFile',function(path,data,cb){returncb(null)})expect(writeFileStub).to.be.calledwriteFileStub.restore();如何确保你的HTTPcookie免受XSS攻击将这些信息添加到set-cookieHTTP标头中:HttpOnly-该属性用于防止跨站点脚本攻击,它不允许JavaScript代码访问cookie。secure-此属性告诉浏览器仅在HTTPS连接上发送cookie,如下所示:Set-Cookit:sid=;HttpOnly下面的代码有什么问题newPromise((resolve,reject)=>{thrownewError('error')}).then(console.log)then后面没有catch,所以如果错误代码仍然运行默默地,它不会告诉你哪里出了问题。修改后:newPromise((resolve,reject)=>{thrownewError('error')}).then(console.log).catch(console.error)如果你调试的是大项目,你不知道哪个Promise可能有问题,你可以使用unhandledRejection。它打印出所有未处理的Promise异常process.on('unhandledRejection',(err)=>{console.log(err)})下面的代码有什么问题?functioncheckApiKey(apiKeyFromDb,apiKeyReceived){if(apiKeyFromDb===apiKeyReceived){returntrue}returnfalse}老实说,我第一次看到的时候是一头雾水。有什么问题?这不是正常的ifelse代码吗?但是这不是普通的ifelse代码,这是用来比对安全证书的代码,这个时候不能透露一点信息,所以一定要在一定时间内比对。否则您的应用程序可能会受到定时攻击。什么是定时攻击?Node.js使用的V8引擎试图从表现层优化代码。它逐个字符进行比较,一旦发现不匹配就停止。你可以使用npm模块cryptiles来解决这个问题functioncheckApiKey(apiKeyFromDb,apiKeyReceived){returncryptiles.fixedTimeCimparison(apiKeyFromDb,apiKeyReceived)}在某个页面上有一个很好的解释。如何通俗地解释定时攻击?以下代码输出了什么Promise.reso(1).then((x)=>x+1).then((x)=>{thrownewError('MyError')}).catch(()=>1).then((x)=>x+1).then((x)=>console.log(x)).catch(console.error)创建一个新的Promise解析参数1解析后的值将被添加1(现在是2),并立即返回这个2。解析后的值被丢弃,抛出异常,并返回新值1。catch之后运行不会停止,在异常处理之前,继续运行,并返回一个新的,递增的值2,返回值打印出来。该行不会运行,因为没有异常