1.NodeJs是什么?
不是一门语言,也不是一种框架,而是JavaScript运行时的一个环境。类似于浏览器,用来解析和执行js代码。不同于JavaScript,nodeJs是属于服务端的js。由某个天才从谷歌上摘下了V8引擎,目前V8引擎是公认的运行最快的引擎。
2.NodeJs中的JavaScript
不同于JavaScript,nodeJs没有Bom和DOM对象,也就是document,window等。采用ecmaScript中JavaScript基本的语言部分,例如变量,方法,数据类型,内置对象,Array等。Node 中为 JavaScript 提供了一些服务器级别的 API,例如http,fs,等。
在node中没有全局作用域的概念,通过require()方法来执行和加载多个自定义的js文件,或者加载node的api中提供的各类核心模块。
例如加载http通信服务的模块:
//1.加载http模块
var http = require("http");
//2.创建web服务器
var server = http.createServer();
//3.on方法中第一个参数是接受request请求,第二个是设置回调函数用于处理请求
server.on("request",function(){
console.log("接受到请求了")
})
//4.开启服务器,设置端口号,设置回调
server.listen(3000,function(){
console.log("打开服务器")
})
例如加载自己创建的js:
文件A.js
console.log("模块A开始");
var Bexports = require("./模块的引用B.js");
console.log(Bexports.fun(10,20));
console.log("模块A结束");
文件B.js
var method = function(x,y){
console.log("你好,我是模块B");
return x + y;
};
exports.fun = method;
var Cexports = require("./模块的引用C.js");
console.log(Cexports.foo)
文件C.js
var text = '你好,我是子模块C';
exports.foo = text;
A文件调用了B文件的method方法,而B文件调用C文件的text字符串,最后通过在cmd中找到路劲,通过node A.js命令,就会显示:
模块A开始
你好,我是子模块C
你好,我是模块B
30
模块A结束
其实很好理解,就好像Java面向对象的特点,一个对象拥有各个属性,方法等。通过给exports对象(默认情况下是空对象),来传递值或方法等。require调用其他文件必须有路径不能直接使用文件名,不然就等同于require('fs')加载node提供的核心模块,那么就无法调用了。关于模块的调用,外部无法访问内部文件,而内部文件也无法访问外部文件的,所以需要用到外部文件的东西时,需使用到exports对象。
关于Http和fs核心模块的读取文件实现交互的简单案例:
var http = require("http")
var fs = require("fs")
var server = http.createServer()
//通过判断request请求的不同路径,读取不同的文件,并设置对应的Content-type文本类型来显示文本信息
//以下分别获取了HTML页面和jpg格式的图片,end()方法只会显示字符串,而无法显示数字,数组,对象等
server.on("request",function(req,res){
var url = req.url;
if(url === '/html'){
fs.readFile('./resource/hello.html',function(err,data){
if(err){
res.end("出错了,请重新操作")
}else{
res.setHeader("Content-Type","text/html;charset=utf-8")
res.end(data)
}
})
}
if(url === '/image'){
fs.readFile('./resource/五月天.jpg',function(err,data){
if(err){
res.end("出错了,请重新操作")
}else{
res.setHeader("Content-Type","image/jpeg")
res.end(data)
}
})
}
if(url === "/index"){
res.end("index.jsp")
}
if(url === "/json"){
var json = [
{
name:"张三",
age:18
},
{
name:"李四",
age:22
},
{
name:"赵五",
age:42
}
]
res.end(JSON.stringify(json))
}
res.end("404 Not Found !")
})
server.listen(3000,function(){
console.log("Server running ......")
})
关于fs模块写入文件的简单小例子:
var fs = require("fs");
//1.路径2.写入内容3.回调函数
fs.writeFile("data/write.txt","你好,世界,写入文件",function(err,data){
if(err){
console.log("创建文件失败");
}else{
console.log("创建文件成功");
}
});
最后补充一个IP号+端口号的定义:127.0.0.1:3000
ip 地址定位计算机,计算机只有一个网卡,IP就相当于是计算的唯一标识;
端口号定位具体的应用程序,凡是要进行网络通信的都会有一个端口号,用于指定运行某个程序。
默认情况下,很多大型的应用程序都会使用80的端口,因为浏览器默认80端口,直接输入例如127.0.0.1的IP,而无需输入端口号就可直接登录服务。