Node.js基础实践问题汇总

引言:最近做了一个非常非常非常小的项目实例,奈何在家太菜,吭哧吭哧写了一天半,把这个实现guo过程中遇到的一些边边角角的小问题都记录一下。

1、写NodeJS服务器端的POST/GET请求

(1)通过reques.method判断客户端的请求方式

(2)通过request.url判断客户端的具体请求接口,返回对应字段

  //post方式=》
    var enddate = {};
    var count = 0;
    if (request.method === "POST") {
        var postData = '';
        request.on('data', function (chunck) {
            postData += chunck;
        })
        request.on('end', function () {
            var postObjc = JSON.stringify(postData);
            enddate[count] = postData;
            count += 1;
            fs.writeFile('orders.json', JSON.stringify(enddate), 'utf8', function () {
                response.end();
            })
        })
    } else {
        //get 
       
   }

上述POST方式接收客户端的数据必须使用字节流的方式。其中两个方法比较重要,request.on('data',callback)监听客户端提交的数据,reuqest.on('end',callback)监听数据传输完毕。 

GET方式,我们用url.parse()对url解析,再取.pathname属性得到请求接口的后缀,再根据正则取到后缀名的结尾格式,比如(.css,.json)最后结合request.url来请求接口,得到服务器响应的数据

 var pathname = url.parse(request.url).pathname;
 var ext = pathname.match(/(\.[^.]+|)$/)[0]; 

 用switch判断后缀名,在做响应

 switch (ext) {
            case ".css":
                fs.readFile("web/css/" + request.url, 'utf-8', function (err, data) { 
                   //读取文件中内容data,并且返回给客户端
                   //......
                });
                break;
            case ".js":
                fs.readFile("." + request.url, 'utf-8', function (err, data) { 
                    //注意这里设置响应头为 "application/javascript",规定返回数据的格式
                    response.writeHead(200, {
                        "Content-Type": "application/javascript"
                    });
                    //......

                });
                break;
            case '.html':
                fs.readFile("web/" + request.url, function (err, data) {
                });
                break;
            case '.ico':
                 //防止浏览器默认请求.ico
                 response.end()
                break;
            case '.jpg':
                fs.readFile("web/imgs" + request.url, function (err, data) {
                  //......
                })
                break;
            default:
            //一般默认返回主页
          }

 综上,我们发现项目中的页面也要请求.js,.css,甚至图片,不是依靠文件关系直接引入,必须也通过请求服务器响应。

上述readfile读取文件的路径不是按照请求页面与资源的相对路径,而是资源与index.js的相对路径。

2、在页面需要封装三个餐馆的名字,现在有三个json文件分别是存储三个餐馆的信息。

需求:只想获取三个餐馆的名字

版本一:最开始,用Ajax请求串联,一直在请求成功的success函数里面调用下一个json文件,获取餐馆的name属性。(因为单独取到name存放到数组中,由于请求是异步,所以页面加载了[]还是空。)回调地狱,太垃圾了。。。

版本二:在服务器端提前包装好数据,主要使用文件系统fs.readdir读取放置三个json文件的文件夹,返回的files再依次遍历单独文件,取到需要的字段。

if (request.url == '/Allres') {
         const directoryPath = path.join(__dirname, 'restaurants');
         fs.readdir(directoryPath, function (err, files) {
                  //handling error
                  if (err) {
                         return console.log('Unable to scan directory: ' + err);
                  }
                  //listing all files using forEach
                   let resObj = {};
                   let reg = /(\w+)[']/;
                   files.forEach(function (file) {
                         let resJSON = require("./restaurants/" + file);
                         var preData = resJSON.name.split(" ")[0];
                         if(resJSON.name.indexOf("'") !==-1){
                                var key = reg.exec(preData)[1];
                         }else{
                                var key = preData;
                         }
                           resObj[key] = resJSON;
                     })
                        response.end(JSON.stringify(resObj));
                  });
             }

3、封装一个简单的Ajax请求

function ajax(options) {
	options = options || {};
	options.type = (options.type || "GET").toUpperCase();
	options.dataType = options.dataType || "json";
	if (options.data) {
		var params = options.data;
	}
	var xhr;
	if (window.XMLHttpRequest) {
		xhr = new XMLHttpRequest();
	} else if (window.ActiveObject) { //Compatible with IE6
		xhr = new ActiveXobject('Microsoft.XMLHTTP');
	}

	if (options.type == "GET") {
		xhr.open("GET", params ? options.url + "?" + params : options.url, true);
		xhr.send(null);
	} else if (options.type == "POST") {
		xhr.open("post", options.url, true);
		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		var pre = JSON.stringify(options.data)
		xhr.send(pre);
	}
	xhr.onreadystatechange = function () {
		if (xhr.readyState == 4) {
			var status = xhr.status;
			if (status >= 200 && status < 300 || status == 304) {
				options.success && options.success(xhr.responseText, xhr.responseXML);
			} else {
				options.error && options.error(status);
			}
		}
	}
}

4、如何判断一个文件夹是否存在

fs.exists(path, callback)

path:判断的文件夹、文件的路径

callback:回调函数

5、popost请求提交的数据,本项目把数据保存到了新的json文件中,请求这个文件时,返回了对象。

对象没有长度,需要遍历时方法如下:(本项目用到这个方法非常多,真香!!)

function countTimes(obj) {
        Object.keys(obj).forEach(key => {
          if(obj[key] ==='frodo'){
                resData = obj.menu  
          }          
     })
        return resData
}

 

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值