# 下载

http://nodejs.cn/download/

# 基础

# node运行js文件,打断调试

https://blog.csdn.net/buddha_itxiong/article/details/80988981
chrome访问:chrome://inspect/#devices,进行调试

# 问题

# npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted,)解决方法

直接用命令清理就行,控制台输入:
npm cache clean --force
https://blog.csdn.net/qq_35624642/article/details/78393035

# 验证:用formidable上传文件

可能报错:
Can t set headers after they are sent
[情况1]
错误:

    res.send(data);  
    res.render('index', { title: TITLE });  

解决:

    return res.send(data);  
    return res.render('index', { title: TITLE });  

[情况2]
错误:
用formidable插件来上传文件
源码:

    form.parse(req, function(err, fields, files) {  
        console.log('22222222222222222222222222222222');  
        console.log(files);  
    
        if (err) {  
          res.locals.error = err;  // 接口回调:local.error  
          TITLE = '失败';  
          return res.render('index', { title: TITLE });  
        }  
    
        var extName = '';  //后缀名  
        switch (files.fulAvatar.type) {  
            case 'image/pjpeg':  
                extName = 'jpg';  
                break;  
            case 'image/jpeg':  
                extName = 'jpg';  
                break;  
            case 'image/png':  
                extName = 'png';  
                break;  
            case 'image/x-png':  
                extName = 'png';  
                break;  
        }  
    
        if(extName.length == 0){  
              res.locals.error = '只支持png和jpg格式图片';  // 接口回调:local.error  
              TITLE = '失败';  
              return res.render('index', { title: TITLE });  
        }  
    
        var avatarName = Math.random() + '.' + extName;  
        var newPath = form.uploadDir + avatarName;  
    
        console.log(newPath);  
        fs.renameSync(files.fulAvatar.path, newPath);  //重命名  
    });  

解决:
form.parse解析的收尾,需要 return 出来。
源码:

    form.parse(req, function(err, fields, files) {  
        console.log('22222222222222222222222222222222');  
        console.log(files);  
        
        if (err) {  
          res.locals.error = err;  // 接口回调:local.error  
          TITLE = '失败';  
          return res.render('index', { title: TITLE });  
        }  
    
        var extName = '';  //后缀名  
        switch (files.fulAvatar.type) {  
            case 'image/pjpeg':  
                extName = 'jpg';  
                break;  
            case 'image/jpeg':  
                extName = 'jpg';  
                break;  
            case 'image/png':  
                extName = 'png';  
                break;  
            case 'image/x-png':  
                extName = 'png';  
                break;  
        }  
    
        if(extName.length == 0){  
              res.locals.error = '只支持png和jpg格式图片';  // 接口回调:local.error  
              TITLE = '失败';  
              return res.render('index', { title: TITLE });  
        }  
    
        var avatarName = Math.random() + '.' + extName;  
        var newPath = form.uploadDir + avatarName;  
    
        console.log(newPath);  
        fs.renameSync(files.fulAvatar.path, newPath);  //重命名  
    
        res.locals.success = '上传成功';  // 接口回调:local.success  
        TITLE = '成功';  
        return res.render('index', { title: TITLE });  
    });  

# 案例

# 双向视频通话技术——webrtc

参考:
https://github.com/ShukriChiu/webrtc.chatdemo
https://github.com/simplewebrtc/SimpleWebRTC

Last Updated: 11/29/2019, 12:12:18 AM