辰迅云帮助中心

帮助中心

 这篇文章主要讲解了“如何解决hosts文件修改完无效的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决hosts文件修改完无效的问题”吧!  当我们需要屏蔽某些恶意网站或访问特定网址以及在内网做测试的时候,常常需要修改hosts 文件,但是会发现有时修改完却总是不生效,而且Windows7系统和Vista系统、XP系统都会碰到此类情况,所以研究一下解决此类问题的办法。  一般在LINUX下修改完/etc/hosts文件都会立即生效的,即便偶尔不生效,只要重启一下network服务就可以了。但是windows却是会遇到这样的问题,而且在不同版本的系统中还略有区别。    在解决问题之前,让我们了解一下dns和hosts的知识。我们知道在访问网站时,首先要通过DNS服务器把要访问的域名解析成IP地址后,我们才能在浏览器中看到所访问网站的页面内容。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有网络域名的映射关系。如果有,则调用这个IP地址映射,如果没有再向已知的DNS服务器提出域名解析,也就是说Hosts的请求级别比DNS高。 下面说一下如何具体修改Hosts文件:首先要知道hosts文件的位置,在xp,2000,win7等系统中找到如下位置C:\windows\system32\drivers\etc,我们可以看到hosts文件,注意hosts文件是ascii编码方式,而且是没有后缀名的。其二正确修改hosts文件,一般hosts文件里面都会有个示例,比如 127.0.0.1 51cto.com   即代表打开51cto.com这个网址将解析到127.0.0.1,ip地址与网址间至少要有一空格,另外在最后一行书写映射时一定要加上回车再保存以避免最后一行不生效,如果某条记录暂时不用,只需要在它前面加一个#号即可。       hosts文件默认具有隐藏属性,系统默认设置情况下是看不到的,解决办法是打开我的电脑-点击工具-文件夹选项-查看-取消勾选隐藏受保护的系统文件,确定即可。如果修改后无法保存,请在Hosts文件上面点右键-属性-把只读属性去掉即可保存。  在修改HOSTS文件时候,还常常遇到修改保存后无效的情况,我们可以使用ipconfig /flushdns命令来刷新dns缓存, 或者也可以在管理工具中打开服务,找到“DNS Client”将其停用并改为手动模式在修改完hosts启动。   注意:当你在打开浏览器的情况下修改hosts文件时,关闭浏览器时系统才会释放掉hosts文件占用的那部分内存,我们再次打开浏览器访问就发现已经生效了。   如果遇到windows 7 操作系统无法打开和编辑的情况,一般是因为安全机制UAC造成的,你可以按着Shift键,然后Hosts文件上面右键,以管理员方式运行即可。或者修改Hosts文件权限,将当前登录的账号加入到安全选项卡中,赋予写入权。   还有一种方法就是打开本地连接的Internet(TCP/IP)协议的属性页,点击常规选项卡中的高级按钮,选择WINS选项卡,勾选“启用 LMHOSTS 查询”,接着按下“导入 LMHOSTS”按钮,导入hosts文件,这样再次启动浏览器时,就会发现hosts文件生效了。感谢各位的阅读,以上就是“如何解决hosts文件修改完无效的问题”的内容了,经过本文的学习后,相信大家对如何解决hosts文件修改完无效的问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是辰讯云,小编将为大家推送更多相关知识点的文章,欢迎关注!...

这篇文章将为大家详细讲解有关node.js中怎么对文件进行操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、文件操作在文件操作里,主要是有文件读写,创建、移动文件等。1.1 读取文件读取文本文件时,如.txt, .js, .json等文件,直接使用readFile就可以获取文件的内容。// server.jsvar fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){  if(err) throw err;  console.log(data); });读取图片时,我们是不能直接输出到控制台中的,是需要创建一个服务器,然后在浏览器上进行查看。其实在上节中,我们已经了解过显示图片的过程了。// server.jsvar http = require('http'),  fs = require('fs'); http.createServer(function(request, response){  // 使用二进制方式读取图片 fs.readFile('./img/test.png', 'binary', function(err, file){   if( err ) throw err;   // 当前数据以image/png方式进行输出  response.writeHead(200, {"Content-Type": "image/png"});   response.write(file, 'binary');   response.end();  }); }).listen(3000);console.log('server has started...');打开浏览器:127.0.0.1:3000,就能看到图片了。1.2 写入文件将字符串写入到文件文件中,是非常简单的操作,使用writeFile即可搞定:var fs = require('fs');var data = '从一开始,就选择了做前端开发,因为觉得前端开发更贴近用户,能够倾听用户的声音,更好玩,更有意思,美的更直观。我们总是在尝试最新的技术,尝试更炫的效果,希望更能优化用户的体验效果!'; fs.writeFile('./test.txt', data, function(err){  if(err) throw err;  console.log('写入数据成功...'); });writeFile方法,在没有文件时会创建文件并写入;若文件存在则内容被覆盖。1.3 创建或文件重命名根据writeFile的特性,可以使用writeFile写入空字符串的方式创建文件。同时,fs.open也可以创建文件:// 打开模式可以使用 w | w+ | a | a+// 这些模式在打开不存在的文件时,会创建文件// fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄fs.open(Date.now()+'.txt', 'a+', function(err, fd){  if(err) throw err;  console.log(fd); })在文件系统中,有一个fs.rename的方法,顾名思义,对文件(文件夹)进行重命名。fs.rename(oldname, newname, callback(err));特性:将oldname文件(目录)移动至newname的路径下,并重新命名;如果oldname和newname是同一个路径,则直接进行重命名。二、文件夹操作通常对目录的操作比较简单一些。2.1 读取文件夹中的文件和文件夹列表使用fs.readdir(path, callback)可以获取path路径下的文件和目录列表,而且只能读取直接目录下的文件和文件夹,子目录里的是获取不到的。fs.readdir('./', function(err, files){  if(err) throw err;  console.log( files ); });输出结果:[  'img',  'msg.txt',  'node_modules',  'package.json',  'server.js',  'test.js',  'tmp' ]node_modules和tmp是文件夹,剩下的是文件,而且是获取不到node_modules和tmp里面的数据。获取一个目录下所有的文件,后面会讲解,稍等。2.2 删除文件夹使用fs.rmdir(path, callback)可以删除文件夹,但只能删除空文件夹,如果当前路径不是文件夹或当前文件夹不为空,则删除失败;删除的为空文件夹时,可以删除成功。fs.rmdir('./tmp', function(err){  if(err){   console.log('删除文件夹失败');   throw err;  }else{   console.log('删除成功');  } })如何删除不为空的目录,后面会讲解,稍等。2.3 获取文件或文件夹的信息fs.stat(path, callback)能够获取path路径的信息,比如创建时间,修改时间,文件大小,当前是否为文件,当前是否为文件夹等信息;如果path路径不存在,则抛出异常。fs.stat('./test.js', function(err, stats){  if( err ){  console.log( '路径错误' );  throw err;  }  console.log(stats);  console.log( 'isfile: '+stats.isFile() ); // 是否为文件 console.log( 'isdir: '+stats.isDirectory() ); // 是否为文件夹});结果:{ dev: -29606086, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 2251799813687343, size: 2063, // path路径为文件夹时,size为0 blocks: undefined, atime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间), mtime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), ctime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), birthtime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间)}isfile: true // 是否为文件isdir: false // 是否为文件夹关于这几个时间属性的理解,可以参考这篇文章。stats中的size属性就是当前文件的大小(单位:字节,除以1024即为kb),stats还有下面方法可供使用:stats.isFile()stats.isDirectory()stats.isBlockDevice()stats.isCharacterDevice()stats.isSymbolicLink() (only valid with fs.lstat())stats.isFIFO()stats.isSocket()fs.stat(path, callback)是异步执行的,对应的还有同步执行版本:fs.statSync(path) ,这个方法返回的就是fs.stats实例。三、综合运用我们在上面的讲解中,还留着两个功能没实现,这里实现一下它的过程。3.1 遍历目录中所有的文件我们已经知道使用readdir只能获取当前目录里的文件和文件夹名称,为了获取这个目录里所有的文件名称,只能是读取当前目录里所有的文件夹里的文件。这里我们使用递归的方法,如果当前资源是文件,则进行存储,是文件夹则进行递归进一步检索,直到把所有的文件夹遍历完毕。// 获取文件夹中所有的文件function readDirAll(path){  // 获取字符串的最后一个字符 var getLastCode = function(str){   return str.substr(str.length-1, 1);  }  var result = []; // 存储获取到的文件 var stats = fs.statSync(path); // 获取当前文件的状态 if( stats.isFile() ){   result.push(path);  }else if( stats.isDirectory() ){   // 若当前路径是文件夹,则获取路径下所有的信息,并循环  var files = fs.readdirSync(path);   for(var i=0, len=files.length; i<len; i++){    var item = files[i],     itempath = getLastCode(path)=='/' ? path+item : path+'/'+item; // 拼接路径   var st = fs.statSync(itempath);    if( st.isFile() ){     result.push(itempath);    }else if( st.isDirectory() ){     // 当前是文件夹,则递归检索,将递归获取到的文件列表与当前result进行拼接    var s = readDirAll( itempath );     result = result.concat( s );    }   }  }  return result; }console.log( readDirAll('./') );使用此程序获取当前目录中所有的文件(展示的为部分文件):[   './bing.doc',  './img/1484234634801.png',  './img/1484234660592.png',  './img/test.png',  './inter.js',  './msg.txt',  './node_modules/formidable/.npmignore',  './node_modules/formidable/.travis.yml',  './node_modules/formidable/index.js',  './node_modules/formidable/lib/file.js',  './node_modules/formidable/lib/incoming_form.js',  './node_modules/formidable/lib/index.js',  ... ]如果想要输出一种树形的结构,就可以对当前的递归程序进行改造,比如我想要输出如下的这种结果,那么,就要分析这种结构的特点:bing.doc          img             |---1484234634801.png      |---1484234660592.png      |---test.png       inter.js          msg.txt           node_modules          |---formidable         |---.npmignore        |---.travis.yml        |---index.js        |---lib           |---file.js    |---incoming_form.js    |---index.js可以看出的规律:第一层级的文件和文件夹前面是没有空格和字符的;第一级子目录中的文件或文件夹前面是1组空格和1个字符;第二级子目录中的文件或文件夹前面是2组空格和1个字符;依次类推…我们可以再传递一个depth来表示当前目录的层级,然后计算出前面空格的数量:// depth为递归的深度,可根据递归的深度输出文件名称前面的格式function readDirAll(path, depth){  // 获取字符串 var getLastCode = function(str){   return str.substr(str.length-1, 1);  }  depth = depth || 0; // 默认为0 var fir_code = '';  // 计算文件名称前面的字符,4个空格为1组 for(var j=0; j<depth; j++){   fir_code += ' ';  }  depth && (fir_code += '|---');  var stats = fs.statSync(path);  if( stats.isFile() ){   console.log( fir_code+path );  }else if( stats.isDirectory() ){   var files = fs.readdirSync(path);   for(var i=0, len=files.length; i<len; i++){    var item = files[i],     itempath = getLastCode(path)=='/' ? path+item : path+'/'+item,     st = fs.statSync(itempath);    console.log( fir_code+item );    if( st.isDirectory() ){     var s = readDirAll( itempath, depth+1 );    }   }  } }console.log( readDirAll('./') );3.2 删除目录使用fs.rmdir(path)是有局限性的,只能删除空目录,如果是个非空目录,我们可以根据上面的思路,写出一个能删除当前目录下所有的文件。递归,只要找到里面的文件夹就递归寻找,直到找到最底层,把最底层的文件删除,然后再逐级向上删除文件夹,直到删除到当前目录。// 删除path下所有的文件和文件夹,包括path自己function rmDirAll(path){  // 获取字符串  var getLastCode = function(str){   return str.substr(str.length-1, 1);  }  var stats = fs.statSync(path); // 获取当前文件的状态  if( stats.isFile() ){   fs.unlinkSync(path);   console.log( '删除成功: '+path );  }else if( stats.isDirectory() ){   // 若当前路径是文件夹,则获取路径下所有的信息,并循环   var files = fs.readdirSync(path);   for(var i=0, len=files.length; i<len; i++){    var item = files[i],     itempath = getLastCode(path)=='/' ? path+item : path+'/'+item; // 拼接路径    var st = fs.statSync(itempath);    if( st.isFile() ){     fs.unlinkSync(itempath);     console.log( '删除成功: '+itempath );    }else if( st.isDirectory() ){     // 当前是文件夹,则递归检索     rmDirAll( itempath );    }   }   // 现在可以删除文件夹   fs.rmdir(path);   console.log( '删除成功: '+path );  } } rmDirAll('./img');则删除时输出的信息如下,先把内部的文件和文件夹删除干净,最后删除 ‘./img':删除成功: ./img/1484234634801.png 删除成功: ./img/1484234660592.png 删除成功: ./img/gggg/est.txt 删除成功: ./img/gggg 删除成功: ./img/test.png 删除成功: ./img当然,你也可以试着实现这样的程序:删除path内部所有的内容,同时能保留下path目录只删除文件,将所有的空文件夹保留下来将内部所有的文件都移动到path的根目录下,并删除空文件夹关于node.js中怎么对文件进行操作就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

这篇文章将为大家详细讲解有关Node.JS中怎么实现事件轮询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。网站延迟的开销对于一个网站,后台大多不需要进行复杂的计算,我们的程序大多时间花费在I/O读取上。看到一个数据:IO操作可以比数据处理慢几个数量级。高端SSD固态硬盘的读取速度可以达到200mb-700mb/s;读取1000字节需要1.4微秒。而在此期间,2GHZ频率的CPU可以执行28000个指令处理周期。而网络数据的IO甚至更慢!NodeJS采用单线程非阻塞的架构解决老大难的IO问题当采用多线程时,为每一个请求开启一个新的线程(Apache就是这样做的)。当并发增多,线程的消耗会十分严重。什么是阻塞和非阻塞呢?阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。var fs = require("fs"); fs.readFile("./testfile", "utf8", function(error, file) {    if (error) throw error;    console.log("我读完文件了!"); }); console.log("我不会被阻塞!");用node执行以下代码,会先输出我不会被阻塞,再输出我读完文件了一个知乎的回答:你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。NodeJS的事件轮询这是node虽然为单线程,但是可以处理大并发,高吞吐量的核心。一个事件轮询拥有下面三个组件事件队列:这是一个FIFO模型的队列,一方推入事件,另一方推出事件队列的读取轮询线程组件,也就是主角Event Loop,单独的线程池,用来执行长任务(也就是threadpool,node底层,用C++写的,不会阻塞)在nodejs中,只有一个主线程(也就是前面说的单线程)来不断读取轮询(书中称为调用I/O观察者)队列中是否有事件。而对于读取文件,HTTP请求等(现代cpu处理能力很强,事件处理相当快,导致运行速度下降的瓶颈在I/O)比较容易堵塞的事件,就在这个单线程中执行肯定会造成堵塞,所以Event Loop会把这类型的事件交给底层的线程池执行,并给予线程池一个回调函数,当线程池操作完成这堵塞任务后,便把结果和回调函数一起再放入轮询队列中。关于Node.JS中怎么实现事件轮询就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

node.js中怎么实现前后台交互功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。执行过程为:(1)在浏览器地址栏输入网址,向node服务器发送HTML请求;服务器接到请求后,返回一个HTML文件给客户端;(2)客户端浏览器对HTML进行渲染,遇到<script>标签后,再次向服务器请求,服务器响应一个JavaScript文件给客户端,(3)客户端浏览器对JavaScript文件进行渲染,渲染过程中,如果遇到ajax请求,客户端还会向服务器进行请求,服务器仍然会响应浏览器。(4)最后,浏览器把渲染好的网页呈现在浏览者面前。1、HTML部分:<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>客户管理系统</title></head><body><div class="box"> <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="link">NEW CUSTOMER</a> <h3>  <span class="fir">ID</span>  <span>NAME</span>  <span class="fir">AGE</span>  <span>PHONE</span>  <span>ADDRESS</span>  <span>CONTROL</span> </h3> <ul id="conList">  <li>   <span class="fir">1</span>   <span>钱成</span>   <span class="fir">25</span>   <span>13044086186</span>   <span>Bei Jing</span>   <span class="control">    <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >修改</a>    <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>   </span>  </li> </ul></div><script charset="utf-8" type="text/javascript" src="js/ajax.js"></script><script charset="utf-8" type="text/javascript" src="js/index.js"></script></body></html>2、ajax部分:~function () {  //->createXHR:创建AJAX对象,兼容所有的浏览器 function createXHR() {   var xhr = null,    flag = false,    ary = [     function () {      return new XMLHttpRequest;     },     function () {      return new ActiveXObject("Microsoft.XMLHTTP");     },     function () {      return new ActiveXObject("Msxml2.XMLHTTP");     },     function () {      return new ActiveXObject("Msxml3.XMLHTTP");     }    ];   for (var i = 0, len = ary.length; i < len; i++) {    var curFn = ary[i];    try {     xhr = curFn();     createXHR = curFn;     flag = true;     break;    } catch (e) {    }   }   if (!flag) {    throw new Error("your browser is not support ajax,please change your browser,try again!");   }   return xhr;  }  //->ajax:实现AJAX请求的公共方法; function ajax(options) {   var _default = {    url: "",    type: "get",    dataType: "json",    async: true,    data: null,    getHead: null,    success: null  };   for (var key in options) {    if (options.hasOwnProperty(key)) {     _default[key] = options[key];    }   }   if (_default.type === "get") {    _default.url.indexOf("?") >= 0 ? _default.url += "&" : _default.url += "?";    _default.url += "_=" + Math.random();   }   //->SEND AJAX  var xhr = createXHR();   xhr.open(_default.type, _default.url, _default.async);   xhr.onreadystatechange = function () {    if (/^2\d{2}$/.test(xhr.status)) {     if (xhr.readyState === 2) {      if (typeof _default.getHead === "function") {       _default.getHead.call(xhr);      }     }     if (xhr.readyState === 4) {      var val = xhr.responseText;      if (_default.dataType === "json") {       val = "JSON" in window ? JSON.parse(val) : eval("(" + val + ")");      }      _default.success && _default.success.call(xhr, val);     }    }   };   xhr.send(_default.data);  }  window.ajax = ajax; }();3、JavaScript部分:var customer = (function () {  var conList = document.getElementById('conList');  function bindEvent() {   conList.onclick = function (ev) {    ev = ev || window.event;    var tar = ev.target || ev.srcElement,     tarTag = tar.tagName.toUpperCase(),     tarInn = tar.innerHTML;    if (tarTag === 'A' && tarInn === '删除') {     //->ALERT、CONFIRM、PROMPT    var cusId = tar.getAttribute('data-id'),      flag = window.confirm('确定要删除编号为 [ ' + cusId + ' ] 的客户吗?');     if (flag) {//->点击的是确定按钮:调取对应的API接口实现删除即可     ajax({       url: '/removeInfo?id=' + cusId,       cache: false,       success: function (result) {        if (result && result.code == 0) {         //->删除成功后在HTML结构中移除对应的LI标签        conList.removeChild(tar.parentNode.parentNode);        }       }      });     }    }   }  }  function bindHTML(data) {   var str = '';   for (var i = 0; i < data.length; i++) {    var cur = data[i];    str += '<li>';    str += '<span class="fir">' + cur.id + '</span>';    str += '<span>' + cur.name + '</span>';    str += '<span class="fir">' + cur.age + '</span>';    str += '<span>' + cur.phone + '</span>';    str += '<span>' + cur.address + '</span>';    str += '<span class="control">';    str += '<a href="add.html?id=' + cur.id + '" rel="external nofollow" >修改</a>';    str += '<a href="javascript:;" rel="external nofollow" data-id="' + cur.id + '">删除</a>';    str += '</span>';    str += '</li>';   }   conList.innerHTML = str;  }  return {   init: function () {    ajax({     url: '/getAllList',     type: 'GET',     dataType: 'JSON',     cache: false,     success: function (result) {      if (result && result.code == 0) {       bindHTML(result.data);       bindEvent();      }     }    });   }  } })(); customer.init();4、node服务器部分:var http = require("http");var url = require("url");var fs = require("fs");var server1 = http.createServer(function (request, response) {  var urlObj = url.parse(request.url, true);  var pathname = urlObj.pathname;  var query = urlObj.query;  var reg = /\.(HTML|CSS|JS|ICO)/i;  if (reg.test(pathname)) {   var suffix = reg.exec(pathname)[1].toUpperCase();   var suffixMIME = suffix === 'HTML' ? 'text/html' : (suffix === 'CSS' ? 'text/css' : 'text/javascript');   try {    var conFile = fs.readFileSync('.' + pathname, 'utf-8');    response.writeHead(200, {'content-type': suffixMIME + ';charset=utf-8;'});    response.end(conFile);    //以conFile结束向客户端的响应,即给客户端返回./index.html的全部代码,供客户端渲染成页面。  } catch (e) {    response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});    response.end('request file is not found!');   }   return;  }  //->数据API请求处理:客户端的JS代码中我们通过AJAX向服务器发送的请求,服务器接收到请求并且 // 获取客户端传递的数据,把需要的数据内容准备好,然后在返回给客户端,客户端在AJAX的READY // STATE等于4的时候获取返回的内容(都是按照API的规范文档来处理) var customData = fs.readFileSync('./json/custom.json', 'utf-8');  customData.length === 0 ? customData = '[]' : null;  customData = JSON.parse(customData);  var result = {   code: 1,   msg: '失败',   data: null };  var customId = null;  //1)获取所有的客户信息 if (pathname === '/getAllList') {   if (customData.length > 0) {    result = {     code: 0,     msg: '成功',     data: customData    };   }   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  //2)获取指定的客户信息 if (pathname === '/getInfo') {   customId = query['id'];   customData.forEach(function (item, index) {    if (item['id'] == customId) {     result = {      code: 0,      msg: '成功',      data: item     };    }   });   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  //3)增加客户信息 if (pathname === '/addInfo') {   var str = '';   request.on('data', function (chunk) {    str += chunk;   });   request.on('end', function () {    var data = JSON.parse(str);    data['id'] = customData.length === 0 ? 1 : parseFloat(customData[customData.length - 1]['id']) + 1;    customData.push(data);    fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');    result = {     code: 0,     msg: '成功'   };    response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});    response.end(JSON.stringify(result));   });   return;  }  //4)修改客户信息 if (pathname === '/updateInfo') {   str = '';   request.on('data', function (chunk) {    str += chunk;   });   request.on('end', function () {    var data = JSON.parse(str),     flag = false;    for (var i = 0; i < customData.length; i++) {     if (data['id'] == customData[i]['id']) {      customData[i] = data;      flag = true;      break;     }    }    if (flag) {     fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');     result = {      code: 0,      msg: '成功'    };    }    response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});    response.end(JSON.stringify(result));   });   return;  }  //5)删除客户信息 if (pathname === '/removeInfo') {   customId = query['id'];   var flag = false;   customData.forEach(function (item, index) {    if (item['id'] == customId) {     customData.splice(index, 1);     flag = true;    }   });   if (flag) {    fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');    result = {     code: 0,     msg: '成功'   };   }   response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});   response.end(JSON.stringify(result));   return;  }  response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});  response.end('request url is not found!'); }); server1.listen(80, function () {  console.log("server is success,listening on 80 port!"); });看完上述内容,你们掌握node.js中怎么实现前后台交互功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...

node.js中如何使用url模块

2021/7/20 22:41:18

本篇文章为大家展示了node.js中如何使用url模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。引入模块var url = require('url');一、url.parse()/* url.parse(urlString[,parseQueryString[,slashesDenoteHost]])  * urlString <string>将被解析的网址  * parseQueryString <boolean> 默认为false,将query解析成一个字符串;如何设为true,则将query解析成一个对象  * @return <object>  */var result = url.parse('https://www.baidu.com/s?ie=UTF-8&wd=node.js')console.log(result);// 打印结果{  protocol: 'https:', // url协议 slashes: true, // 斜线'/' auth: null, // 用户认证 host: 'www.baidu.com', // 主机 port: null, // 端口 hostname: 'www.baidu.com', // 主机名 hash: null, // hash 值 search: '?ie=UTF-8&wd=node.js', // url中查询信息,包含'?' query: 'ie=UTF-8&wd=node.js', // url中查询信息,不包含'?' pathname: '/s', // 跟在host之后的整个文件路径 path: '/s?ie=UTF-8&wd=node.js', // pathname和search href: 'https://www.baidu.com/s?ie=UTF-8&wd=node.js' // 元素url}二、url.format(urlObject)format方法与parse方法相反,它用于根据某个对象生成urlvar urlObj = {  protocol:'http',  host:'www.baidu.com',  pathname:'/page',  search:'?index=1&sign=true'}var urlStr = url.format(urlObj);console.log(urlStr);// 打印结果// http://www.baidu.com/page?index=1&sign=true三、url.resolve(from,to)用于拼接urlvar urlStr = url.resolve('http://www.baidu.com/','page');console.log(urlStr);// 打印结果// http://www.baidu.com/pagevar urlStr1 = url.resolve('/page/person/','pic');console.log(urlStr1);// 打印结果// /page/person/pic上述内容就是node.js中如何使用url模块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这篇文章主要讲解了“Linux删除目录的命令是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux删除目录的命令是什么”吧!linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中&hellip;&hellip;直接rm就可以了,不过要加两个参数-rf 即:rm -rf   目录名字-r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思需要提醒的是:使用这个rm -rf的时候一定要格外小心,linux没有回收站的当然,rm还有更多的其他参数和用法,输入man rm就可以查看了Related posts:在Linux操作的一些命令Linux系统修改root的密码Linux多个ip增加运行感谢各位的阅读,以上就是“Linux删除目录的命令是什么”的内容了,经过本文的学习后,相信大家对Linux删除目录的命令是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是辰讯云,小编将为大家推送更多相关知识点的文章,欢迎关注!...

MongoDB中怎么查询数据

2021/7/16 23:30:19

MongoDB中怎么查询数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下:db.user.insertMany( [{ name:'jack', age:22, sex:'Man', tags:['python','c++','c'], grades:[22,33,44,55], school:{ name:'shida', city:'xuzhou' } },{ name:'jhon', age:33, sex:null, tags:['python','java'], grades:[66,22,44,88], school:{ name:'kuangda', city:'xuzhou' } }, { name:'xiaoming', age:33, tags:['python','java'], grades:[66,22,44,88], school:{ name:'kuangda', city:'xuzhou' } } ] )find( , )其中 query 表示查找的条件,相当于 mysql 中 where 子句, projection 列出你想要查找的数据,格式为  db.collection.find(find(<query filter>, <projection>))实例:下面不带参数的查找,将会查找出所有的结果 db.find().pretty();          //输出结果           {                                                              "_id" : ObjectId("59056f81299fe049404b2899"),          "name" : "jack",                                       "age" : 22,                                            "tags" : [                                                     "python",                                              "c++",                                                 "c"                                            ],                                                     "grades" : [                                                   22,                                                    33,                                                    44,                                                    55                                             ],                                                     "school" : {                                                   "name" : "shida",                                      "city" : "xuzhou"                              }                                              }下面找出满足 name 为 jack 的数据,并且只输出 name , age ,这里的 _id 是默认输出的,如果不想输出将将它设置为 0  ,想要输出那个字段将它设置为1db.user.find({name:'jack'},{name:1,age:1})  //输出结果 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22 }   db.user.find({name:'jack'},{name:1,age:1,_id:0})  //输出结果 {"name" : "jack", "age" : 22 }**注意这里的一个 projection 不能 同时 指定包括和排除字段,除了排除 _id 字段。 在 显式包括 字段的映射中, _id  字段是***一个您可以 显式排除 的。查询内嵌文档上述例子中插入的 school 数据就表示内嵌文档完全匹配查询完全匹配查询表示 school 中的查询数组必须和插入的数组完全一样,顺序都必须一样才能查找出来db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}});  //输出结果  { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }   //下面是指定输出的字段,这里的school.name表示只输出school文档中name字段,必须加引号 db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1}); //输出结果 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "school" : { "name" : "shida" } }键值对查询可以通过键值对查询,不用考虑顺序,比如 'school.name':'shida' ,表示查询学校名字为shida 的数据,这里的引号是必须要的db.user.find({'school.name':'shida'},{name:1,school:1});  //输出结果  { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "school" : { "name" : "shida", "city" : "xuzhou" } }查询操作符下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。我们使用下面的比较操作符 "$gt" 、 "$gte" 、  "$lt" 、 "$lte" (分别对应 ">" 、 ">=" 、 "<" 、 "<=" )实例下面查询年龄在 20-30 之间的信息db.user.find({ age:{$gt:20,$lt:30}   })  //输出 { "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$ne$ne 表示不相等,例如查询年龄不等于 22 岁的信息db.user.find({age:{$ne:22}})  //输出 { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }slice$slice 操作符控制查询返回的数组中元素的个数。此操作符根据参数 { field: value } 指定键名和键值选择出文档集合,并且该文档集合中指定  array 键将返回从指定数量的元素。如果 count 的值大于数组中元素的数量,该查询返回数组中的所有元素的。语法: db.collection.find( { field: value }, { array: {$slice: count }}) ;下面将查询 grades 中的前两个数db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});  //输出,可以看出这里的grades只输出了前面两个  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "age" : 22, "grades" : [ 22, 33 ], "school" : { "name" : "shida" } }下面将输出后3个数据db.user.find({name:'jhon'},{grades:{$slice:-3},name:1});  //输出 { "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "grades" : [ 22, 44, 88 ] }下面介绍指定一个数组作为参数。数组参数使用 [ skip , limit ]  格式,其中***个值表示在数组中跳过的项目数,第二个值表示返回的项目数。db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});  //这里将会跳过前面的两个,直接得到后面的两个数据   //输出  { "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] }$exists如果 $exists 的值为 true ,选择存在该字段的文档,若值为 false 则选择不包含该字段的文档下面将会查询不存在sex这一项的信息db.user.find({sex:{$exists:false}})  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }   db.user.find({sex:{$exists:true}});  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }$or执行逻辑 OR 运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。语法: { $or: [ { <expression1> }, { <expression2> }, ... , {  <expressionN> } ] }下面将要查找 age 等于 22 或者 age 等于 33 的值db.user.find({$or:[{age:22},{age:33}]})  //结果  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }下面将会查找出年龄为22或者33并且姓名为 jack 的人的信息db.user.find({name:'jack',$or:[{age:33},{age:22}]})  //结果  { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$and指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。 $and 操作符使用短路操作,若***个表达式的值为“ false  ”,余下的表达式将不会执行。语法: { $and: [ { <expression1> }, { <expression2> } , ... , {  <expressionN> } ] }下面将会查找年龄在 20-30 之间的信息,对于下面使用逗号分隔符的表达式列表, MongoDB会提供一个隐式的 $and 操作:db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]}) //上述语句相当于db.user.find({age:{$gt:20},age:{$lt:30}})  //结果 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }$in匹配键值等于指定数组中任意值的文档。类似 sql 中 in ,只要匹配一个 value 就会输出语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] }  }下面将会查找grades中存在22,33之间的任意一个数的信息 db.user.find({grades:{$in:[22,33]}})    //输出   { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } } { "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ],  "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }$nin匹配键不存在或者键值不等于指定数组的任意值的文档。类似 sql 中 not in (SQL中字段不存在使用会有语法错误).查询出 grades 中不存在100或者44的文档db.user.find({grades:{$nin:[100,44]}})$not执行逻辑 NOT 运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。 $not 操作符不能独立使用,必须跟其他操作一起使用语法:{ field: { $not: { } } }查询年龄不大于30的信息db.user.find({age:{$not:{$gt:30}}})  //输出 { "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ],  "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }看完上述内容,你们掌握MongoDB中怎么查询数据的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...

MongoDB与MySQL哪个好

2021/7/16 23:24:00

本篇文章为大家展示了MongoDB与MySQL哪个好,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是MySQL / MariaDB?MySQL AB的Monty Widenius和David Axmark最初于1994年开始开发MySQL。产品名称中的“  My”是指Widenius的女儿,而不是英语单词“ my”。MySQL旨在与mSQL(又名Mini)兼容。  SQL),并添加了SQL查询层和开放源代码许可(实际上是专有和GPL双重许可)。MySQL的公共发行版于1996年底开始,并且每年或每两年持续发行一次。MySQL是当前最受欢迎的关系数据库。Sun Microsystems于2008年以10亿美元的价格收购了MySQL  AB,Oracle于2010年收购了Sun。在Oracle收购MySQL的广泛关注中,Widenius在收购Oracle之前就将MySQL  5.5合并到了MariaDB中。MariaDB努力维护与Oracle MySQL版本的兼容性。与功能更强大的商业关系数据库(例如Oracle数据库,IBM DB / 2和Microsoft SQL  Server)相比,MySQL最初是一个相当低端的关系数据库,尽管它足以成为动态网站的后备存储。多年来,它增加了您希望从关系数据库获得的大多数功能,包括事务,参照完整性约束,存储过程,游标,全文索引和搜索,地理索引和搜索以及群集。尽管MySQL现在支持“大数据库”功能,例如主从部署,与Memcached一起使用以及水平分片,但它仍通常用于中小型部署。将MySQL扩展到多个从属服务器可以提高读取性能,但是只有主服务器才能接受写请求。AWS提供了两种形式的MySQL即服务,即Amazon RDS和Amazon  Aurora。后者具有更高的性能,可以处理TB级的数据,更新副本的延迟时间更短,并且可以直接与Oracle数据库和SQL Server竞争。什么是MongoDB?MongoDB是高度可伸缩的操作文档数据库,可在开源版本和商业企业版本中使用,它可以在本地运行或作为托管云服务运行。托管云服务称为MongoDB  Atlas。MongoDB无疑是NoSQL数据库中最受欢迎的数据库。它的文档数据模型为开发人员提供了极大的灵活性,而其分布式体系结构则提供了很好的可伸缩性。因此,通常选择MongoDB用于必须管理大量数据,得益于水平可伸缩性并处理不适合关系模型的数据结构的应用程序。MongoDB是一个基于文档的存储,在其之上还具有一个基于图形的存储。MongoDB实际上并不存储JSON:它存储BSON(二进制JSON),该扩展了JSON表示(字符串)以包括其他类型,例如int,long,date,浮点,decimal128和地理空间坐标。MongoDB可以使用数据的类型生成正确的索引类型,从而在数据的单个副本上生成多模式图形,地理空间,B树和全文本索引。MongoDB使您可以在任何文档字段上创建索引。MongoDB  4具有多文档事务,这意味着即使必须标准化数据设计,您仍然可以获得ACID属性。默认情况下,MongoDB使用动态模式,有时称为无模式。单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。您可以随时使用动态模式更改文档结构。但是,可以使用架构治理。从MongoDB 3.6开始,MongoDB支持JSON模式验证,您可以在验证器表达式中将其打开。LAMP和MEAN堆栈在LAMP和MEAN堆栈上存在很多变化。例如,您可以在Windows(WAMP)或MacOS(MAMP)上运行而不是Linux  OS。您可以运行IIS(WIMP),而不是Windows上的Apache Web服务器。您可以运行PostgreSQL或SQL  Server,而不是LAMP堆栈中的MySQL关系数据库。如果您需要全球分布,则可以运行CockroachDB或Google Cloud  Spanner。可以使用Perl或Python代替PHP语言。如果要使用Java或C#进行编码,则需要考虑单独的堆栈系列。您可以运行Couchbase或Azure Cosmos  DB以获得更好的全局分布,而不是MEAN堆栈中的MongoDB文档数据库。可以使用十二个Node.js Web服务器框架中的任何一个来代替Express  。除了AngularJS前端框架,您还可以运行Angular 2或React。如何为您的应用程序选择数据库选择数据库时要问的最重要的问题是:您希望在应用程序成熟时存储多少数据?您希望在高峰负载下同时处理多少个用户?您的应用程序需要什么可用性,可伸缩性,延迟,吞吐量和数据一致性?您的数据库架构多久更改一次?您的用户群体的地理分布是什么?您的数据的自然“形状”是什么?您的应用程序需要在线事务处理(OLTP),分析查询(OLAP)还是同时需要两者?您期望生产中的读写比例是多少?您需要地理查询和/或全文查询吗?您首选的编程语言是什么?你有预算吗?如果是这样,它将涵盖许可和支持合同吗?这些问题中的几个会趋于缩小数据库的选择范围,但是与制定LAMP堆栈时相比,我们有更多选择。如果您要构建一个应用程序,并且该应用程序必须在99.999%的时间内对全世界的用户都具有高度的一致性,那么只有少数几个数据库适合您。如果您的应用程序将在工作日的上午9点至下午6点在一个国家/地区使用,并且可以容忍最终的一致性,那么几乎所有数据库都可以使用,尽管某些数据库对于开发人员和操作员而言更容易,而某些数据库则可以为您的主要使用场景提供更好的性能。虽然LAMP和MEAN堆栈一次是Web应用程序的良好解决方案,但现在都不是最佳选择。而不是盲目采用任何一种,您应该仔细考虑用例,并找到一种可在可预见的将来为您的应用程序服务的体系结构。SQL还是NoSQL?您什么时候需要关系数据库(例如MySQL)用于新应用程序?除了对标准SQL的明显支持外,关系数据库本身将数据强制为具有一致的强类型字段的表格模式,并且只要您利用规范化就可以帮助您避免数据重复。如果需要避免丢失数据,则可以NOT  NULL在创建或修改表时声明字段。如果您需要由开放地理空间联盟定义的地理查询,则大多数关系数据库都将提供可靠的实现。而且,如果您需要全文搜索,则大多数关系数据库都允许您在文本字段上定义倒排列表索引,FULLTEXT在MySQL中称为索引。另一方面,如果您还需要偶尔的自由格式文档,则MySQL和许多其他关系数据库也支持RFC  7159定义的JSON数据。如果您还想使用XML文档和XPath或XSLT,则大多数关系数据库都可以提供这种能力。您何时需要像MongoDB这样的文档数据库?如果您的主要用例需要允许使用自由格式的数据,在文档之间更改类型的字段,随时间变化的架构或嵌套的文档,则NoSQL数据库将满足要求。另外,如果您的应用程序是用JavaScript编写的,那么文档数据库的JSON格式将很自然。上述内容就是MongoDB与MySQL哪个好,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这篇文章将为大家详细讲解有关MongoDB中怎么恢复误删的数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法一:通过 oplog 恢复如果部署的是 MongoDB 复制集,这时还有一线希望,可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条  oplog,所以当数据库被误删后,可以通过重放现有的oplog来「尽可能的恢复数据」。前不久遇到的一个用户,运气非常好,数据库是最近才创建的,所有的操作都还保留在oplog里,所以用户通过oplog把所有误删的数据都找回了。通过 oplog 恢复数据的流程非常简单,只需要把oplog集合通过mongodump导出,然后通过mongorestore 的 oplogReplay  模式重放一下。Step1: 导出 oplog 集合mongodump -d local -c oplog.rs -d -o backupdirStep2: 拷贝oplog集合的数据mkdir new_backupdir  cp backupdir/local/oplog.rs.bson new_backupdir/oplog.bsonStep3: 重放oplogmongorestore --oplogReplay new_backupdir方法二:通过备份集恢复如果对 MongoDB 做了全量备份 + 增量备份,那么可以通过备份集及来恢复数据。备份可以是多种形式,比如:通过 mongodump 等工具,对数据库产生的逻辑备份拷贝 dbpath 目录产生的物理备份文件系统、卷管理等产生的快照等关于MongoDB中怎么恢复误删的数据库就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

RedHat中怎么移除MongoDB

2021/7/16 23:15:15

这期内容当中小编将会给大家带来有关RedHat中怎么移除MongoDB,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。由于MongoDB新的服务器端公共许可证(SSPL),Red Hat将不会在Red Hat Enterprise  Linux或Fedora中使用MongoDB。MongoDB这款开源文档NoSQL数据库摊上了问题。虽然大受欢迎,但这边厢AWS、IBM  Cloud、Scalegrid和ObjectRocket等云计算公司将MongoDB作为一项服务来提供,因此赚得钵满盆满;那边厢,MongoDB公司却迟迟未能将其变现,在市场上获得同样大的成功。MongoDB的答案是什么?让这款软件改而采用新的服务器端公共许可证(SSPL)。开源巨头Red  Hat的反应又是什么?从Red Hat Enterprise Linux(RHEL)8中删除MongoDB。Red Hat的技术和社区外联项目经理Tom Callaway在宣布从Fedora  Linux中删除MongoDB的声明中解释道:“Fedora认为SSPL是为了对特定类别的用户带有严重歧视而有意设计的。”Debian  Linux已经从其发行版中删除了MongoDB。具体来说反对意见是,如果你提供采用SSPL许可证的服务,SSPL要求你必须开源将该软件作为服务来提供所使用的所有程序。微软***执行官Steve  Ballmer曾发出过有名的警告,称Linux的GPL“是一种从知识产权角度来看依附在它所接触的一切事物上的毒瘤,”他说错了。但是SSPL明确试图这么做。MongoDB的***技术官兼联合创始人Eliot  Horowitz在开源倡议组织(OSI)围绕SSPL展开讨论时解释了这么做的道理:我们认为,在当今世界,连接已被程序作为服务来提供以及通过网络连接程序作为程序结合的主要形式所取代。目前不清楚现有的反版权(copyleft)许可证是否明确适用于这种形式的程序组合,我们打算让SSPL成为开发人员消除这种不确定性的一种选择。它没有奏效。Callaway继续说道:此外,很显然,许可证作者的意图是让采用许可证的软件的商业用户产生恐惧、不确定和怀疑(FUD)这种情绪。将SSPL视为“免费”或“开源”导致这个影子投射到了FOSS生态系统的所有其他许可证上,即使这些许可证中没有一个带来这种风险。此前,OSI拒绝宣布SSPL是开源许可证。拟议中的SSPLv2也在OSI停滞不前。MongoDB改变许可证背后的商业出发点是,迫使云计算公司使用MongoDB的商业云产品之一。这也没有奏效。AWS刚推出了DocumentDB,这款数据库“旨在与你现有的MongoDB应用程序和工具兼容”,AWS宣传官Jeff  Barr写道。“它与2017年11月推出的MongoDB版本3.6兼容(那时还没有采用SSPL),并且通过模拟MongoDB客户端预计来自MongoDB服务器的响应来实现MongoDB  3.6 API。”MongoDB对此并不满意。MongoDB的***执行官Dev  Ittycheria说:“模仿是最真诚的奉承,因此亚马逊试图利用MongoDB的受欢迎程度和发展势头坐享其成也就不足为奇了。但是开发人员聪明得很,辨别得了真正的创新和拙劣的模仿。”真是这样吗?MongoDB试图通过SSPL获取收入的做法似乎适得其反。现在唱反调的不光是云计算公司,连Linux供应商都没有给MongoDB好脸色看。正如EnterpriseDB的***系统工程师Devrim  G&uuml;nd&uuml;z所说:“我确实很明白MongoDB决定改用SSPL的原因。看到超级云服务提供商从流行开源项目赚到的钱比开发和维护这些项目的贡献者多得多,确实让人郁闷。”但是开源项目创建者之一Bruce  Perens说,没有人阻止“你使用任何许可证。只是别称之为开源。”上述就是小编为大家分享的RedHat中怎么移除MongoDB了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注辰讯云资讯频道。...