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
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值