nodejs是什么东西?
javascript的一个运行环境,没有bom与dom
必须依赖npm
命令行:nodejs –version //查看版本号
nodejs中的javascript
helloworld案例
进入目录
该目录下有如下js文件
tips: shift+右键 可以在当前位置打开命令行
通过Node运行js文件(文件名不能为node.js)
读写文件
读文件
var fs = require(“fs”);
param1:要读取的文件路径 param2:回调函数
成功 data 有数据 error null
失败 data null error 错误对象
fs.readFile(‘./data/hello.txt’,function(error,data)){
//读取出来的是二进制,但是它会转成十六进制
//无论是什么进制,都可以用toString方法转化为我们能认识的字符
console.log(data,toString());
}
写文件
var fs = require(‘fs’)
param1:文件路径 param2:文件内容 param3:回掉函数
成功:error null
失败:error 就是错误对象
terminal插件:sumblime的插件,可以命令行定位到页面位置
fs.writeFile(‘./data/’,’我是nodejs’,function(error){
console.log(‘文件写入成功’)
if(error){
console.log(‘读取文件失败了’);
}else{
console.log(data.toString());
}
})
简单的http服务器
你可以使用node搭建一个简单的web服务器
在node中专门提供了核心模块:http
- 加载http核心模块
var http = require(‘http’);
- 使用http.createServer() 创建一个web服务器,
返回一个server实例
var servere = http.createServer()
- 提供服务,提供数据(处理请求)
server.on(‘request’,function(request,response){
//会自动获取端口号后面的地址
//好像spring中的@RequestMapping("/{page}")
public String showPage(@PathVariable String page){
return page; }
//127.0.0.1:3030/abc 结果就为abc
console.log(“收到客户端的请求了,请求路径是”+request.url)
//这里写响应请求,最后一定要写end结束响应
response.write(“响应成功”)
response.end();
//思考,如何响应不同的路径,返回不同的结果
})
- 绑定端口号,启动服务器
server.listen(3000,function(){
console.log(‘服务器启动成功了,可以通过http://localhost:3000/访问’)
})
启动顺序
根据不同的路径响应不同的数据
server.on(‘request’,function(req,res){
var url = req.url;
if(url===’/’){
res.end(‘index page’);
}else if(url===’/login’){
res.end(‘login page’);
}else{
res.end(‘404 not found’)
}
})
响应js对象
由于res.end()只能响应的内容只能是二进制数据或者字符串
数字,对象,数组不能响应,所以需要转化为json数据
var product = [
{name:’苹果x’,
price:8888
}
];
res.end(JSON.stringify(product));
监听端口号:
req.socket.remoteAddress;
req.socket.remotePort;
端口号范围:0-65536之间
设置编码:
res.setHeader(‘content-Type’,’text/plain;charset=utf-8’);
读取文件
if(url===”/”){
fs.readFile(‘./…/json’,function(err,data){
if(err){
res.setHeader(‘content-Type’,’text/plain;charset=utf-8’);
res.end(‘文件读取失败’);
}else{
//文件是二进制数据,可以通过toString转字符串
//res.end支持二进制与字符串
res.end(data);
}
});
}
读取网页并响应
server.on(‘request’,function(req,res){
var url = req.url;
fs.readFile(‘./templete.html’,function(err,data){
if(err){
return res.end(‘404 not found’);
}
res.end(data);
})
})
得到当前目录的下的文件 如何将文件名与目录名替换到templete.html中?
fs.readFile(‘目录’,function(err,files){
if(err){
return console.log(‘目录不存在’);
}
console.log(files);
})
使用模板引擎
如何将拼接字符串
var content = ‘’;
files.forEach(function(item){
//在EcmaScript6的`字符串中 可以使用${}来引用变量
content+=`
<tr>
<td data-value=”apple/”><a href=”#”>${item}</a>
</tr>`
})
nodejs核心模块
node为javascript提供了很多服务器级别的API,这些API绝大多数包含到了一个具体的核心模块中,如文件操作模块fs,http构建的http模块,path路径操作模块,os操作系统信息模块。
而require就是获取模块的方法
require
require这个api是加载文件并执行的意思
相对路径必须加./(表示文件所在当前目录),那么上级路径呢?../
如何加载自定义的模块(所谓自定义的模块就是自己创建的js文件)
require(‘./b.js’);
node中没有全局作用域,只有模块作用域,就是说加载的模块里面的成员变量不会影响当前模块的成员变量
外部访问不到内部,内部也访问不到外部,就像是黑盒子
模块是如何进行通信?
拿到被加载文件中的模块导出的接口对象
在每个文件中都提供了一个对象,exports,默认是一个Null对象
var bExceports = require(‘./b’);
console.log(bExceports.foo);
console.log(bExceports.add(10,30));
b.js中
模板引擎art-templete
//全局安装
npm install -g webpack
//安装到你的项目目录
npm install --save-dev webpack
npm init
输入这个命令后,终端会问你一系列诸如项目名称,项目描述,作者等信息,
// 安装Webpack
npm install --save-dev webpack
回到之前的空文件夹,并在里面创建两个文件夹,app文件夹
npm install art-template
<script
src=”node_modules/art-template/lib/template-web.js”></script>
<script type=”text/template” id=”tp1”>
hello {{ name }}
//{ { } }与法被被称为mustache语法 八字胡语法
</script>
<script type=”text/template”>
var ret = template(‘tp1’,{
name:’jack’
});
console.log(ret);
</script>
在node中使用art-template
在普通的html中只能通过<script>加载
var template = require(‘art-template’);
install中的名字是什么,require加载的名字就是什么
template.render(‘模板字符串’,替换对象);
template.render(‘{{ name }}’,{name: ‘jack’});
//注意:param1必须是字符串
如果你想通过读取预先写好的html文件,必须先使用toString方法
fs.readFile(‘./tpl.html’,function(err,data){
if(err){
return console.log(‘读取文件失败’);
}
var ret = template.render(data.toString,json)
});
响应html页面
var htmlStr = template.render(data.toString,json)
res.end(htmlStr);
模板引擎遍历数组
{{ each files}}
{{$value}}
{{/each}}