引言:最近做了一个非常非常非常小的项目实例,奈何在家太菜,吭哧吭哧写了一天半,把这个实现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
}