Node.js基础

Node.js 基础

1. 安装node.js

Node.js网站下载

其中LTS版本代表稳定版,api查询可以在Node.js中文网查找

安装后电脑会带有node命令和npm命令

通过node -vnpm -v可以查看当前版本

更新已经安装的npm库

$ npm update –g

更新Nodejs自身到最新版本

安装n模块

$ npm install –g n

通过n模块更新

$ n latest

推荐先去官网查看当前稳定版本,使用n将node安装到制定版本。

$ n 6.11.3

npm命令会连接到过国外的服务器,推荐用使用cnpm

cnpm是淘宝团队开发的镜像,通过cnpm安装的库比npm安装的快很多,并且安装的版本和npm安装的版本会保持一致

安装cnpm,以后所有的npm命令都用cnpm代替

$ npm install -g cnpm –registry=https://registry.npm.taobao.org

同步cnpm模块

$ cnpm sync connect

2. 模块化

新建一个文件夹nodejs

然后下面分别新建两个文件app.jsuser.js,把user.js当做一个模块,app.js去引用

  • nodejs
    • user.js
    • app.js

user.js代码如下

1
2
3
4
5
6
7
//通过module.exports的方法去输出
module.exports = {
userName : 'lalala',
sayHi : ()=>{
return 'javascript'
}
}

app.js代码如下

1
2
3
let app = require('./user.js');//node有很多自己的模块,不同模块不同功能,根据功能去加载模块,更多查看文档
console.log(app.userName);
console.log(app.sayHi());

然后在命令行中,找到nodejs文件夹,使用node命令执行app.js文件

$ node app.js

得到’lalala’和’javascript’,在app.js中找到了user.js的内容。

当然还有另一种方式

user.js代码如下,这是将名字直接暴露出来的方法

1
2
3
4
exports.userName = 'hello world';
exports.sayHi = ()=>{
return 'hi'
}

3. 启用服务器

app.js代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let http = require('http');//启动服务器
let url = require('url');//url地址相关
let util = require('util');//实用工具
let server = http.createServer( (req,res)=>{
//当使用隐式的响应头时(没有显式地调用 response.writeHead()),该属性控制响应头刷新时将被发送到客户端的状态码。
res.statusCode = 200;
//util.inspect()将对象转成字符串,url.parse()要解析的url字符串
//req.url获取到的不是一个完整的url地址
let utilUrl = util.inspect(url.parse(req.url));
console.log( `url.parse(req.url) = ${url.parse(req.url)}` );//[Object];
console.log(`util.inspect = ${utilUrl}`);//[string]
//必须要用end来结束,不然会一直运行
res.end(utilUrl);
} )
//监听的地址和端口
server.listen(3000,'127.0.0.1', ()=>{
console.log('服务器已经启动');
})

通过127.0.0.1:3000可以访问页面

4. 读取一个文件

新建一个文件a.text,内容随意

新建一个node启动jsfs.js

1
2
3
4
5
let fs = require("fs"); //node 内置模块可直接引入 fs:文件系统操作模块
fs.readFile("./a.text","utf-8",function(err,data){ //读取文件(访问路径,编码格式,回调函数)
console.log(err,data);
});

执行代码

$ node fs.js

得到a.text中的内容

修改文件

fs.js中加入writeFile方法

1
2
3
4
5
6
7
8
9
let fs = require("fs"); //node 内置模块可直接引入 fs:文件系统操作模块
fs.readFile("./a.text","utf-8",function(err,data){ //读取文件
if(err) throw err;//检测到异常结束程序
//读取的后续操作可写在这里
fs.writeFile("./b.text",data,function(err){ //写入文件(写入文件路径和名字、如果没有将创建一个,内容,回调)
if(err) throw err;
})
});

然后执行代码

$ node fs.js

得到新的文件b.text,内容是a.text的内容

b.text中追加内容appendFile

新建文件appFile.js

1
2
3
4
5
6
7
8
9
let fs = require('fs');
fs.readFile("./a.text","utf-8",function(err,data){ //读取文件
if(err) throw err;//检测到异常结束程序
//读取的后续操作可写在这里
fs.appendFile("./b.text",data,function(err){ //写入文件
if(err) throw err;
})
});

执行代码

$ node addFile.js

$ node addFile.js

$ node addFile.js

此时的b.text

5. 改变文件夹名字和文件名字

新建node启动jschange.js

1
2
3
4
5
6
7
8
9
var fs = require("fs");
fs.rename("c","d",function(err){ //将c 文件夹名字 改为 d
if(err) throw err;
})
fs.rename("a.text","c.text",function(err){
if(err) throw err;
})

执行命令

$ node change.js

6. 通过域名返回一个index.html页面

新建两个html页面,index.htmllogin.html,内容随意

新建一个node启动jsserver.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//启动需要用到的模块
let http = require('http');
let url = require('url');
let fs = require('fs');
//服务器设置,req请求,res响应
let server = http.createServer( (req,res)=>{
//解析parsename,就是index.html还是logon.html
let pathName = url.parse(req.url).pathname;
//fs.readFile 异步地读取一个文件的全部内容
fs.readFile( pathName.substring(1), (err,data)=>{
//判断是否找到
if(err){
//发送一个响应头给请求。 状态码是一个三位数的 HTTP 状态码,如 404。 最后一个参数 headers 是响应头。 第二个参数 statusMessage 是可选的状态描述。
res.writeHead( 404, {
'Content-Type': 'text/html'
} );
}else{
res.writeHead( 200, {
'Content-Type': 'text/html'
} );
res.write( data );
//可以查看data到底是什么内容
console.log( data.toString() );
}
//end()必须要在fs.readFile内部结束
res.end();
} )
} )
//启动服务器
server.listen(3000,'127.0.0.1', ()=>{
console.log('服务器启动了 ;)');
})

执行命令

$ node server.js

通过127.0.0.1:3000/index.html127.0.0.1:3000/login.html访问,会访问到对应html

7. 发送一个get请求

新建一个jsgetSth.js,这里的get连接是网上随便找的,这里选用的慕课网的一个请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let http = require('http');
http.get('http://www.imooc.com/index/getstarlist', (res)=>{
let data = '';
//res.on 监听一个状态
res.on('data', (chunk)=>{
//因为数据不是一次获取到的,所以需要用+=
data += chunk;
})
//监听结束
res.on('end', ()=>{
//拿到的数据是字符串,需要自己转一次
let result = JSON.parse(data);
console.log(result);
})
})

执行命令

$ node getSth.js

8. 发送一个post请求

因为和get不同,post需要用到另一个方法request

新建一个jspostSth.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
let http = require('http');
let querystring = require('querystring');//需要用到此方法将数据格式转换一次
let util = require('util');
//数据内容
const userSth = querystring.stringify({
user_phone:'15800006532',
user_pwd:'qweqwe'
});
//请求得地址,端口,路径和头部信息
const options = {
hostname: '139.196.168.235',
port: 80,
path: '/ljfc/index.php/lkx_api/user/login',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Content-Length': Buffer.byteLength(userSth)
}
};
const req = http.request(options, (res)=>{
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应主体: ${chunk}`);
});
res.on('end', () => {
console.log(userSth);
console.log('响应中已无数据。');
});
})
req.on('error', (e) => {
console.error(`请求遇到问题: ${util.inspect(e.message)}`);
});
// req.write(require('querystring').stringify(postData));
//把数据写入进去
req.write(userSth);
req.end();

执行命令

$ node postSth.js

9. 请求一个jsonp

jsonp的请求也需要用request方法,而不是直接get请求。

新建一个jsjsonpSth.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
let http = require('http');
let querystring = require('querystring');
let util = require('util');
//这里需要保留,为空就行
const userSth = querystring.stringify({
});
const options = {
hostname: 'api.k780.com',
port: 80,
path: '/?app=weather.future&weaid=chengdu&appkey=26453&sign=baec6bf5282b1b119c2a04cd6b3039cc&format=json&jsoncallback=data',
method: 'GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
// 'Content-Length': Buffer.byteLength(userSth)
}
};
const req = http.request(options, (res)=>{
// console.log(`状态码: ${res.statusCode}`);
// console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应主体: ${chunk}`);
});
res.on('end', () => {
// console.log(userSth);
console.log('响应中已无数据。');
});
})
req.on('error', (e) => {
console.error(`请求遇到问题: ${util.inspect(e.message)}`);
});
// req.write(require('querystring').stringify(postData));
//还是需要写入进去
req.write(userSth);
req.end();

执行命令

$ node jsonpSth.js

我,曼妥思,打钱