NODE JS

218 阅读2分钟

node问答:

  1. **node单线程怎么处理高并发?**node单线程是指只有一个执行程序代码也就是主线程,另外还维护一个事件队列,将大量的异步操作比如网络请求io处理等放到事件队列里面,主线程执行完之后通过事件循环调用事件队列里面的任务,从线程池中分配线程执行这些任务,当队列执行完毕之后通知主线程执行回调,队列线程将还给线程池。node主线程将所有的异步操作都交给内部的线程池去实现本身只负责不断的往返调度。
  2. **node错误处理?**常用的捕获异常的方法trycatch无法捕获node异步操作的异常,通常在回调函数的第一参数中传入err。或者通过事件eventEmitter监听error。有未捕获的异常时可以监听process的uncaughtException事件。

node基础:

  1. nodemon监听文件变化刷新启动

  2. jest单元测试:建立__test__文件夹,新建index.spec.js文件,导入需要测试的内容进行测试操作,最后用jest [test文件夹的父文件夹名称] ([--watch]:监听内容变化) 运行单元测试。

    expect(要测试的内容).toBe(期待的内容)
    
  3. promisify:包一层fs.readFile让它promise化 

    const fs = require('fs')
    const {promisify} = require('util')
    const readFile = promisify(fs.readFile)
    
    process.nextTick(async ()=>{
        const data = await readFile(xxx)})
    
  4. Buffer 缓冲区:为了在js中处理二进制数据

  5. http服务区中,从request构造解析url和method做不同的返回处理resp.end(data)

        const http = require('http')
        const fs = require('fs')
        const server = http.createServer((request, response) => {   
        const { url, method ,headers} = request
            if (url === '/' && method === 'GET'){
                    // 静态页面服务
                     fs.readFile('index.html',(err,data) => {
                    response.statusCode = 200 
                     response.setHeader('Content-Type','text/html')
                    response.end(data)
                  })        
            }else if(url === '/users' && method === 'GET'){
                // Ajax服务
                response.writeHead(200,{'Content-Type': 'application/json' })
                   response.end(JSON.stringify({ name : 'laowang'}))
           }else if(method === 'GET' && headers.accept.indexOf('image/*') !== -1){ 
               // 图片文件服务
             fs.createReadStream('./'+url).pipe(response) 
           }})server.listen(3000)
    
  6. 用流处理大文件读取文件操作

     const fs=require('fs')
     fs.createReadStream(xxx).pipe(response) //返回文件数据
    

用cluster监听进程中断后重启 (可用pm2启动代替)

const cluster = require('cluster');
const os = require('os');
const process = require('process');
const workers = {};
if (cluster.isMaster) {  
    cluster.on('exit', (worker, code, signal) => {  
        console.log(`worker ${worker.process.pid} died`);   
        delete workers[worker.process.pid];   
        worker = cluster.fork();    
        console.log(`worker ${worker.process.pid} start`);  
    });  
    worker = cluster.fork();
} else {
    console.log('else');  
    const app = require('./server');  
    app.listen(3000);}
    process.on('SIGTERM', () => {  
        process.kill(worker.process.pid); 
        process.exit(0);
    });
}

nginx 配置

docker - 高效、敏捷、轻量级的容器(轻量虚拟)方案