var url = require(‘url’);
var a = url.resolve(‘/one/two/three’, ‘four’) ,
b = url.resolve(‘http://example.com/’, ‘/one’),
c = url.resolve(‘http://example.com/one’, ‘/two’);
console.log(a +“,”+ b +“,”+ c);
//输出结果:
///one/two/four
//http://example.com/one
//http://example.com/two
- fs 文件模块
文件写入
Node中文件读取的方式主要有:
fs.readFile(file[, options], callback(error, data))
fs.readFile(‘c:\demo\1.txt’, ‘utf8’, (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFileSync(file[, options])
try {
const data = fs.readFileSync(‘c:\demo\1.txt’, ‘utf8’);
console.log(data);
} catch(e) {
// 文件不存在,或者权限错误
throw e;
}
- fs.createReadStream(path[, options])
const stream = fs.createReadStream(‘c:\demo\1.txt’);
let data = ‘’
stream.on(‘data’, (trunk) => {
data += trunk;
});
stream.on(‘end’, () => {
console.log(data);
});
文件写入
Node中文件写入的方式主要有:
- fs.writeFile(file, data[, options], callback(error))
fs.writeFile(‘c:\demo\a.txt’, new Date(), (error) => {
console.log(error);
});
- fs.writeFileSync(file, data[, options])
try {
fs.writeFileSync(‘c:\demo\a.txt’, new Date());
} catch (error) {
// 文件夹不存在,或者权限错误
console.log(error);
}
- fs.createWriteStream(path[,option])
var streamWriter = fs.createWriteStream(‘c:\demo\a.txt’);
setInterval(() => {
streamWriter.write(${new Date}\n
, (error) => {
console.log(error);
});
}, 1000);
-
path模块
-
path.basename(path[, ext])
-
path路径
-
ext可选的文件扩展名
-
path.basename() 方法返回一个 path 的最后一部分
path.basename(‘/foo/bar/baz/asdf/quux.html’);
// 返回: ‘quux.html’
path.basename(‘/foo/bar/baz/asdf/quux.html’, ‘.html’);
// 返回: ‘quux’
- path.dirname(path)
- path.dirname() 方法返回一个 path 的目录名
path.dirname(‘/foo/bar/baz/asdf/quux’);
// 返回: ‘/foo/bar/baz/asdf’
如果 path 不是一个字符串,则抛出 TypeError。
注意:只能返回目录名,并不能返回目录的详细信息
path.extname(path)
path.extname() 方法返回 path 的扩展名
path.extname(‘index.html’);
// 返回: ‘.html’
path.extname(‘index.coffee.md’);
// 返回: ‘.md’
path.extname(‘index.’);
// 返回: ‘.’
path.extname(‘index’);
// 返回: ‘’
path.extname(‘.index’);
// 返回: ‘’
path.join([...paths])
path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。
path.join(‘/foo’, ‘bar’, ‘baz/asdf’, ‘quux’, ‘…’);
// 返回: ‘/foo/bar/baz/asdf’
path.join(‘foo’, {}, ‘bar’);
// 抛出 ‘TypeError: Path must be a string. Received {}’
- path.normalize(path)
path.normalize() 方法会规范化给定的 path,并解析 ‘…’ 和 ‘.’ 片段
path.parse(path)
path.parse() 方法返回一个对象,对象的属性表示 path 的元素。 尾部文件分隔符会被忽略
返回的对象有以下属性
dir
root
base
name
ext
path.parse(‘C:\path\dir\file.txt’);
// 返回:
// { root: ‘C:\’,
// dir: ‘C:\path\dir’,
// base: ‘file.txt’,
// ext: ‘.txt’,
// name: ‘file’ }
-
QueryString 参数处理
-
querystring.escape(str)
-
querystring.unescape(str)
-
querystring.parse(str[, sep[, eq[, options]]])
-
querystring.stringify(obj[, sep[, eq[, options]]])
queryString用于解析与格式化 URL 查询字符串
方法一:querystring.escape(str)
对给定的 str 进行 URL 编码。
方法二:querystring.unescape(str)
对给定的 str 进行 URL 解码。
方法三:querystring.stringify(obj[, sep[, eq[, options]]])
将对象转化成字符串
sep 第二个参数 用于界定查询字符串中的键值对的子字符串。默认为 ‘&’。
eq 第三个参数 用于界定查询字符串中的键与值的子字符串。默认为 ‘=’。
options
encodeURIComponent 把对象中的字符转换成查询字符串时使用的函数。默认为 querystring.escape()。该方法通过遍历给定的 obj 对象的自身属性,生成 URL 查询字符串。
// 假设存在 gbkEncodeURIComponent 函数。
querystring.stringify({ w: ‘中文’, foo: ‘bar’ }, null, null,
{ encodeURIComponent: gbkEncodeURIComponent });
方法四:querystring.parse(str[, sep[, eq[, options]]])
将query字符串装华为对象
sep 第二个参数 用于界定查询字符串中的键值对的子字符串。默认为 ‘&’。
eq 第三个参数 用于界定查询字符串中的键与值的子字符串。默认为 ‘=’。
options
decodeURIComponent 解码查询字符串的字符时使用的函数。默认为 querystring.unescape()。
maxKeys 指定要解析的键的最大数量。指定为 0 则不限制。默认为 1000。
- HTTP 模块概要
http.createServer([options][, requestListener])
fs模块对文件的几乎所有操作都有同步和异步两种形式
例如:readFile() 和 readFileSync()
区别:
同步调用会阻塞代码的执行,异步则不会
异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调
异常处理方面,同步必须使用 try catch 方式,异步可以通过回调函数的第一个参数
var fs=require(‘fs’)
console.time(‘sync’);
try {
var data = fs.readFileSync(‘./c.txt’);
console.log(data);
} catch (error) {
throw error;
}
console.timeEnd(‘sync’);
console.time(‘async’);
fs.readFile(‘./c.txt’,(error, data) => {
if (error) throw error;
console.log(data);
});
console.timeEnd(‘async’);
- 普通静态资源服务器
var http=require(‘http’);
//文件模块 操作文件 读取文件,写入文件
var fs=require(‘fs’);
function read(str,res){
fs.readFile(str,function(err,data){
if(!err){
res.write(data);
res.end();
}
})
}
var server=http.createServer(function(req,res){ // /img/2.gif
//接受请求, 做出应有
console.log(req.url);//请求路径 端口后面的,参数前面的 / /favicon.ico
if(req.url==‘/’){
read(‘./index.html’,res);
}else if(req.url==‘/favicon.ico’){
read(‘./img/ico.png’,res);
}else{
read(‘.’+req.url,res); // read(‘.’+‘/img/2.gif’,res)
}
});
//三个参数, 参数一:端口号(取值范围:0-65535,0-1024系统保留端口,80端口可以省略)
//参数二:域名(ip)
//参数三:回调函数
server.listen(3001,‘127.0.0.1’,function(err){
//err 错误对象参数 err–>null err—>{error:xxx}
if(!err){//正确
console.log(‘服务器成功运行在127.0.0.1:3000上’)
}
})
- 带登录接口的服务器
- index.html文件
用户名:
密码:
登录
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-6f1QD6Yt-1715577747320)]
[外链图片转存中…(img-KYAzqiRg-1715577747320)]
[外链图片转存中…(img-SHE9bWhy-1715577747320)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!