1、使用Sublime Text
,最好安装一下Node
这个package,安装之后不仅有代码提示这些,而且可以直接右击run
,不再需要到cmd
里面node xxx
去执行。当然,里面的代码基本就是JS的代码。
2、先写个简单入门程序吧,在server.js
文件中。
——这个代码就是简单创建一个服务器,然后挂起监听。其中判断请求里面的路径,根据请求输出不同的内容。实际开发肯定不是这么写,这边只是一个简单的例子。我们测试的时候,在浏览器中输入localhost:1337/index
之类的就可以了。这里用到了我们接触的第一个模块,叫http
。
const http = require('http');
var server = http.createServer(function(req, res){
switch(req.url){
case '/index':
res.write("This is index page.");
break;
case '/about':
res.write("This is about page.");
break;
default:
res.write("This is 404 page.");
break;
}
res.end();
});
server.listen(1337)
3、继续补充案例。加上了读写文件。读写文件都有一个回掉函数作为参数。用到的就是文件系统模块,叫fs
。
——目录结构如下:
const http = require('http');
const fs = require('fs');
var server = http.createServer(function(req, res){
var file_path = './www' + req.url;
fs.readFile(file_path, function(err, data){
if(err){
res.write('404');
}else{
res.write(data);
}
// 读写文件是异步的,但读写不能再end之后,所以需要把end放在这里,保证前后执行顺序
res.end();
});
});
server.listen(1337)
4、接着测试从客户端接收数据的例子。我们用一个form
表单,先测试用get方法。
——这是我们的目录结构。
index.html
里面如截图,不展示代码了。server.js
代码如下:
——核心逻辑是判断请求路径,如果是/index.html
的话,就加载那个页面,如果不是的话(比如form
表单的action
的地址),就去处理。我们这里判断比较简单,简化了一下。
——其次,这里面是通过req.url
后,然后对这个url
进行各种切割,各种提取,最终把里面的参数成功放在一个叫做r
的字典里面。
const http = require('http');
const fs = require('fs');
var server = http.createServer(function(req, res){
var file_path = './www' + req.url;
if (req.url == '/index.html') {
// 加载页面
fs.readFile(file_path, function(err, data){
if (err) {
}else{
res.write(data);
}
res.end();
});
}else{
// 处理结果
r = {}
if (req.url.indexOf('?')!=-1) {
// /result?username=aaa&pwd=aaa
var urlParams = req.url.split('?')[1];
var kvs = urlParams.split('&');
for (var i = 0; i < kvs.length; i++) {
var temp = kvs[i].split('=');
r[temp[0]] = temp[1];
}
res.write(r['username']+':'+r['pwd']); // aaa:aaa
console.log(r); // { username: 'aaa', pwd: 'aaa' }
}
res.end();
}
});
server.listen(1337)
5、当然,我们会有更简单的方法,就是使用querystring
模块,它的parse
函数可以解析中间带有&
的字符串,自动分割成一个字典。
const querystring = require('querystring');
// 处理结果
r = {};
if (req.url.indexOf('?')!=-1) {
// /result?username=aaa&pwd=aaa
var urlParams = req.url.split('?')[1];
r = querystring.parse(urlParams);
res.write(r['username']+':'+r['pwd']); // aaa:aaa
console.log(r); // { username: 'aaa', pwd: 'aaa' }
}
res.end();
6、当然,还有更简单的方法,使用url
模块,它的parse
方法可以解析整个url
,解析之后,想要什么自己取即可。
const urlLib = require('url');
// 处理结果
r = {};
var o = urlLib.parse(req.url,true);
res.write(o.pathname+'\n'+o.query['username']+':'+o.query['pwd']);
console.log(o);
res.end();
我们可以看到,这个时候,被解析出来的o
是下面这样子的。需要注意的是上面的方法后面还加了一个true
参数,那么如果不加呢?不加的话,下面的query
对应的值就不是字典的样子,而是用&
连接起来的一个字符串,就是最原始的那个。
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?username=aaa&pwd=aaa',
query: { username: 'aaa', pwd: 'aaa' },
pathname: '/result',
path: '/result?username=aaa&pwd=aaa',
href: '/result?username=aaa&pwd=aaa' }
7、其实上面,我们在表单里面用了get
,一般不会这样。正常情况是用post
,现在我们就来看看怎么使用和接收数据。
——同样的,文件结构不变,html
页面里面只不过把get
变成了post
而已。
——看到对于post
过来的数据,因为考虑到可能有多次,所以不能直接获取,而是通过监听data
和end
两个事件来获取数据,基于req
的data
事件,意思就是这个请求只要传数据就触发,可能会触发多次。基于req
的end
方法就是请求结束后触发,就触发一次。
// 处理结果
var str = '';
// 数据量大的时候可能会执行很多次
req.on('data',function(data){
// 结果类似xxx=xxx&&yyy=yyy
str += data;
console.log(str);
});
req.on('end',function(){
// 解析输出
var r = querystring.parse(str);
console.log(r);
});
res.end();
注意:
如果请求是get的话,用get和post两个方法都能获取到数据;但是当请求方式是post的时候,get的那个方法就获取不到数据了。