node.js的特点
单线程:只有一个线程执行任务
非堵塞I/O:在I/O耗时操作时,线程不堵塞
事件驱动:使用事件驱动程序往下继续运行
node,js模块化
规范:遵循common.js规范
加载模块的时候同步。当遇到require() 语句时,会停下来等加载完成然后继续往下执行。
暴露模块的时候推荐通过exports.xx = 或 module.exports.xx = 或 module.exports = 向外暴露。
在node,js中,每一个JS文件就是一个模块
在node,js中,分为内置核心模块 和 自定义模块(或者第三方模块)
内置核心模块:
这些模块是node,js自带的,比如http url querystring fs(FileSystem)
引入方式:直接调用名称引入
自定义模块(或者第三方模块):
引入方式:使用“./”开头 加上 名称
注意:
但是假如自定义模块(或者第三方模块)放在node_modules目录下,放进去的模块就跟内置核心模块一样的引入方式
这种方式引入,看上去像是引入了核心模块 其实只是一种假象 moduleA并不是变成了核心模块 只是引入方式一样了。
var moduleA = require("moduleA");
当同一级目录中有node_modules文件夹时,并且里面有moduleA模块 并且上一级目录中有node_modules文件夹,里面也有moduleA模块时,会引用同级目录下的node_modules文件夹中的模块
当同级有node_modules文件夹但是没有moduleA模块, 但是上级有node_modules文件夹也有moduleA模块,此时会使用上级的moduleA模块
模块暴露:node.js 向外暴露的方式与sea.js一样,推荐module.exports 或者exports.
http模块
搭建服务器
req对象:请求对象 所有的请求时浏览器附加的信息都可以从req身上获取
req.url 请求对象中url地址的path部分(pathname + search)
注意:url地址的组成部分
req.method 请求对象中请求方式get 还是 post 返回值是大写
req.connection.remoteAddress 请求对象中访问服务器的客户端的IP地址
req.on("data", function(data_chunk){ }) 在处理post请求时,请求数据时
req.on("end", function(){ }) 在处理post请求时,请求数据完毕时
res对象:响应对象 决定返回结果给前端由res决定
res.setHeader( ) 设置响应对象的响应头
res.end(data) 该方法决定返回内容并挂断连接
注意:这里的data必须是buffer类型或者字符串类型 buffer类型调用toString()方法
res.write(data) 该方法决定返回内容但是不挂断连接
res.status 决定响应状态
监听服务器
第一个参数:端口号
第二个参数:IP地址