一、Node.js 回调函数

  • Node.js 异步编程的直接体现就是回调函数
  • Node 所有 API 都支持回调函数。
  • 回调函数一般作为函数的最后一个参数出现。

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

二、Node.js 事件循环

  • Node.js 是单进程单线程应用程序。
  • Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
  • Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数
  • Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
  • Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类绑定和监听事件,如下实例:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);// 触发事件
eventEmitter.emit('eventName');

三、Node.js EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列

Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

EventEmitter 类

  • events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发事件监听器功能的封装。
  • 当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
  • 对于每个事件,EventEmitter 支持 若干个事件监听器。当事件触发时,注册到这个事件的事件监听器被依次调用事件参数作为回调函数参数传递
  • EventEmitter 提供了多个属性,如 on 和 emiton 函数用于绑定事件函数,emit 属性用于触发一个事件。
  • error事件:EventEmitter 定义了一个特殊的事件 error。我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:emitter.emit('error'); 
  • 继承EventEmitter:包括fs、net、 http在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它原因有两点:首先,具有某个实体功能的对象实现事件符合语义, 事件的监听和发生应该是一个对象的方法。其次 ,JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。

四、Node.js Buffer(缓冲区)

  • JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer类,该类用来创建一个专门存放二进制数据的缓存区
  • 一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存
  • Node.js 目前支持的字符编码包括:ascii、utf8、utf16le(ucs2)、base64、latin1(binary)、hex。
const buf = Buffer.from('runoob', 'ascii');// 输出 72756e6f6f62
console.log(buf.toString('hex'));// 输出 cnVub29i 
console.log(buf.toString('base64'));
描述方法
创建 Buffer 类

常见的有 Buffer.alloc(size[, fill[, encoding]])、Buffer.from(array)、Buffer.from(buffer) 、Buffer.from(string[, encoding])。更多详情见菜鸟教程【Buffer】

写入缓冲区buf.write(string[, offset[, length]][, encoding])。返回值:返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。
从缓冲区读取数据buf.toString([encoding[, start[, end]]])。返回值:解码缓冲区数据并使用指定的编码返回字符串。

将 Buffer 转换为 JSON 对象

buf.toJSON()。当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。

缓冲区合并

Buffer.concat(list[, totalLength])。返回值:返回一个多个成员合并的新 Buffer 对象。

缓冲区比较

buf.compare(otherBuffer)。返回值:返回一个数字,表示 buf 在 otherBuffer 之前(<0),之后(>0)或相同(=0)。

拷贝缓冲区

buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])。没有返回值。

缓冲区裁剪

buf.slice([start[, end]])。返回值:返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

缓冲区长度

buf.length。返回值:返回 Buffer 对象所占据的内存长度。
其他方法buf[index]、buf.equals(otherBuffer)、buf.fill(value[, offset][, end])

五、Node.js Stream(流)

1. Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)

2. Stream 有四种流类型:Readable - 可读操作、Writable - 可写操作、Duplex - 可读可写操作、Transform - 操作被写入数据,然后读出结果。

3. 所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。

4. 从流中读取数据

var fs = require("fs");
var data = '';// 创建可读流
var readerStream = fs.createReadStream('input.txt');// 设置编码为 utf8。
readerStream.setEncoding('UTF8');// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {data += chunk;
});readerStream.on('end',function(){console.log(data);
});readerStream.on('error', function(err){console.log(err.stack);
});console.log("程序执行完毕");

5.  写入流

var fs = require("fs");
var data = '菜鸟教程官网地址:www.runoob.com';// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');// 标记文件末尾
writerStream.end();// 处理流事件 --> data, end, finish, and error
writerStream.on('finish', function() {console.log("写入完成。");
});writerStream.on('error', function(err){console.log(err.stack);
});console.log("程序执行完毕");

6. 管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

var fs = require("fs");// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);console.log("程序执行完毕");

7. 链式流

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。

接下来我们就是用管道和链式来压缩和解压文件。

 创建 compress.js 文件, 代码如下:

var fs = require("fs");
var zlib = require('zlib');// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt').pipe(zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));console.log("文件压缩完成。");

接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:

var fs = require("fs");
var zlib = require('zlib');// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('input.txt'));console.log("文件解压完成。");

六、Node.js 模块系统

1. 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。

2. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

3. Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

创建 hello.js 文件,代码如下:

exports.world = function() {console.log('Hello World');
}

创建 main.js 文件,代码如下:

var hello = require('./hello');
hello.world();

有时候我们只是想把一个对象封装到模块中(module),例如:

//hello.js 
function Hello() { var name; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; 
}; 
module.exports = Hello;//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

注:exports 和 module.exports 的使用

如果要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports

4. Node.js 的 require 方法中的文件查找策略如下:

Node.js 中存在 4 类模块(原生模块和3种文件模块),原生模块优先级更高。

七、Node.js 函数

在JavaScript中,一个函数可以作为另一个函数的参数。Node.js中函数的使用与Javascript类似。

1)先定义,再传递

function say(word) {console.log(word);
}function execute(someFunction, value) {someFunction(value);
}execute(say, "Hello");
var http = require("http");function onRequest(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();
}http.createServer(onRequest).listen(8888);

2)匿名函数

function execute(someFunction, value) {someFunction(value);
}execute(function(word){ console.log(word) }, "Hello");
var http = require("http");http.createServer(function(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();
}).listen(8888);

八、Node.js 路由

我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。

我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块

server.js 文件代码如下:

var http = require("http");
var url = require("url");function start(route) {function onRequest(request, response) {var pathname = url.parse(request.url).pathname;console.log("Request for " + pathname + " received.");route(pathname);response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started.");
}exports.start = start;

 router.js 文件代码如下:

function route(pathname) {console.log("About to route a request for " + pathname);
}exports.route = route;

同时,我们会相应扩展 index.js,使得路由函数可以被注入到服务器中:

var server = require("./server");
var router = require("./router");server.start(router.route);

九、Node.js 全局对象

JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。

1. 全局对象与全局变量

global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:

  • 在最外层定义的变量(在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文);
  • 全局对象的属性;
  • 隐式定义的变量(未定义直接赋值的变量)。

注意: 最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。

2. 全局变量

__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。

__dirname 表示当前执行脚本所在的目录

3. 全局函数:setTimeout(cb, ms)、clearTimeout( t ) 、setInterval(cb, ms)、clearInterval(t)。

4. console对象

console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。

常见的console对象方法:console.log()、console.info()、console.error()、console.warn()、console.dir()、console.time()、console.timeEnd()、console.trace()、console.assert()。

console.info("程序开始执行:");var counter = 10;
console.log("计数: %d", counter);console.time("获取数据");
//
// 执行一些代码
// 
console.timeEnd('获取数据');console.info("程序执行完毕。")
$ node main.js
程序开始执行:
计数: 10
获取数据: 0ms
程序执行完毕

5. process

process 是一个全局变量,即 global 对象的属性。

它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口。

常用的process 对象成员方法:exit、beforeExit、uncaughtException、Signal 事件。

process.on('exit', function(code) {// 以下代码永远不会执行setTimeout(function() {console.log("该代码不会执行");}, 0);console.log('退出码为:', code);
});
console.log("程序执行结束");
$ node main.js
程序执行结束
退出码为: 0

process 属性

// 输出到终端
process.stdout.write("Hello World!" + "\n");// 通过参数读取
process.argv.forEach(function(val, index, array) {console.log(index + ': ' + val);
});// 获取执行路径
console.log(process.execPath);// 平台信息
console.log(process.platform);
$ node main.js
Hello World!
0: node
1: /web/www/node/main.js
/usr/local/node/0.10.36/bin/node
darwin

process 方法

// 输出当前目录
console.log('当前目录: ' + process.cwd());// 输出当前版本
console.log('当前版本: ' + process.version);// 输出内存使用情况
console.log(process.memoryUsage());
$ node main.js
当前目录: /web/com/runoob/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }

 更多process的属性和方法见菜鸟教程:https://www.runoob.com/nodejs/nodejs-global-object.html

十、Node.js 常用工具

util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心 JavaScript 的功能过于精简的不足。

util.inherits(constructor, superConstructor) 是一个实现对象间原型继承的函数。特别注意,仅仅继承了原型。

util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换为字符串的方法,通常用于调试和错误输出

  • 它至少接受一个参数 object,即要转换的对象。
  • showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。
  • depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。
  • 如果 colors 值为 true,输出格式将会以 ANSI 颜色编码,通常用于在终端显示更漂亮的效果。
  • 特别要指出的是,util.inspect 并不会简单地直接把对象转换为字符串,即使该对象定义了 toString 方法也不会调用。

util.isArray(object):如果给定的参数 "object" 是一个数组(如:[]、new Array())返回true,否则返回false。

util.isRegExp(object):如果给定的参数 "object" 是一个正则表达式(如:/some regexp/、new RegExp("another regexp"))返回true,否则返回false。

util.isDate(object):如果给定的参数 "object" 是一个日期(如:new Date())返回true,否则返回false(如:Date()不行)。

util.isError(object):如果给定的参数 "object" 是一个错误对象(如:new Error()、new TypeError())返回true,否则返回false。

十一、Node.js 文件系统

描述方法
导入文件系统模块(fs)

var fs = require("fs")

读取文件内容异步的 fs.readFile(file, callback) 和同步的 fs.readFileSync(file, callback)
打开文件(异步模式)

fs.open(path, flags[, mode], callback)

其中,flags - 文件打开的行为,常见的有r/r+/rs/rs+/w/wx/w+/wx+/a/ax/a+/ax+。

mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。

callback - 回调函数,带有两个参数如:callback(err, fd)。

获取文件信息(异步模式)

fs.stat(path, callback)

其中,callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。

stats类中的方法有:stats.isFile()/stats.isDirectory()/stats.isBlockDevice()/

stats.isCharacterDevice()/stats.isSymbolicLink()/stats.isFIFO()/vstats.isSocket()

写入文件(异步模式)

fs.writeFile(file, data[, options], callback)

其中,options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666,flag 为 'w'。

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。

追加文件内容(异步模式)fs.appendFile(filename, data[, options], callback)
读取文件(异步模式)

fs.read(fd, buffer, offset, length, position, callback)

其中,fd - 通过 fs.open() 方法返回的文件描述符

buffer - 数据写入的缓冲区。

offset - 缓冲区写入的写入偏移量。

length - 要从文件中读取的字节数。

position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。

callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

关闭文件(异步模式)

fs.close(fd, callback)

截取文件(异步模式)

fs.ftruncate(fd, len, callback)

其中,len - 文件内容截取的长度。

删除文件fs.unlink(path, callback)
  
创建目录

fs.mkdir(path[, options], callback)

其中,options 参数可以是:

recursive - 是否以递归的方式创建目录,默认为 false。

mode - 设置目录权限,默认为 0777。

读取目录

fs.readdir(path, callback)

其中,callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。

删除目录fs.rmdir(path, callback)

十二、Node.js GET/POST请求

1. 获取 GET 请求内容:

var http = require('http');
var url = require('url');
var util = require('util');http.createServer(function(req, res){res.writeHead(200, {'Content-Type': 'text/plain'});// 解析 url 参数var params = url.parse(req.url, true).query;res.write("网站名:" + params.name);res.write("\n");res.write("网站 URL:" + params.url);res.end();}).listen(3000);

2. 获取 POST 请求内容

var http = require('http');
var querystring = require('querystring');var postHTML = '<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +'<body>' +'<form method="post">' +'网站名: <input name="name"><br>' +'网站 URL: <input name="url"><br>' +'<input type="submit">' +'</form>' +'</body></html>';http.createServer(function (req, res) {var body = "";req.on('data', function (chunk) {body += chunk;});req.on('end', function () {// 解析参数body = querystring.parse(body); //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。// 设置响应头部信息及编码res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});if(body.name && body.url) { // 输出提交的数据res.write("网站名:" + body.name);res.write("<br>");res.write("网站 URL:" + body.url);} else {  // 输出表单res.write(postHTML);}res.end();});
}).listen(3000);

END

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Node.js基础—— 如何通过 npm 发布模块

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块。在 Node.js 中,创建一个模块非常简单,代码如下:var mysql = require(mysql);那么如何通过NPM…...

    2024/4/24 13:23:35
  2. Node.js安装下载完整配置

    本博文源于js基础,下面旨在讨论如何下载配置Node.js点击next接受,下一步修改安装路径,自己心里要有数。next即可这是要做的步骤,新手默认即可下载必要的安装工具,必选安装等待下载安装成功后,会弹出命令参数配置成功收获喜悦并作进一步验证!...

    2024/4/24 13:23:34
  3. Node.js连接数据库总结

    node.js连接mysql数据库 在node中输入npm install mysql(注意安装路径) 电脑必须安装mysql数据库(这是前提),创建一个数据库,建立一个表,本教程中用的是nodesmaple,表名是t_user 新建a.js代码:var mysql = require(mysql); var conn = mysql.createConnection({host: …...

    2024/4/24 13:23:33
  4. Node.js学习总结(一)

    一、准备资源1. 安装Visual Studio 2017 Community.2. Node.js官网:https://nodejs.org/3. 选择版本v10.15.3LTS,安装Node.js,并在VS2017 Installer中配置Node.js。4. 至此Node.js环境搭建完毕。5. Node.js官方文档(包括API和入门教程Guides)二、跑官网Node.js的第一个demo.…...

    2024/4/24 13:23:32
  5. Node.js 究竟是什么?

    原文出处:https://www.ibm.com/developerworks/cn/opensource/os-nodejs/作者:Michael AbernethyNode.js 究竟是什么?一个 “编码就绪” 服务器Michael Abernethy2011 年 4 月 26 日发布/更新: 2011 年 10 月 09 日15编者按本文的第一版发表后,文中谈到的各种观点在社区中引…...

    2024/4/29 4:16:11
  6. Node.js入门教程 第二篇 (HelloWorld及事件分发)

    createServer创建第一个Node.js程序http模块的createServer函数实际调用V8引擎的C++库,对指定端口进行监听(socket)。当端口有连接访问时进行处理。使用createServer函数搭建Node.js服务:var http = require(http);//引用http模块http.createServer(function (request, res…...

    2024/4/15 3:59:53
  7. node.js实现mqtt 发布/订阅 消息到主题

    node.js实现mqtt 发布/发送 消息到主题 mqtt是啥?我的博客有写这个东西:传送门安装 首先你要安装node.js和npm 教程传送门 随后找个文件夹执行 命令行 安装mqtt模块; npm install mqtt 如果需要服务端 执行 npm install mosca 使用mqtt的文档 以下代码中有些参数可以从mqtt官方…...

    2024/4/19 17:40:41
  8. node.js入门学习(2)模块系统

    什么是模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。(摘自菜鸟教程…...

    2024/4/15 3:59:52
  9. ubuntu 安装node.js

    ubuntu -- 安装node.jsNode.js 在实时的 Web应用上采用了基于 WebSocket 的推送技术。这意味着什么样的革命性?Well,在经过了20多年的基于无状态的请求-返机制的无状态交互之后,我们终于有了实时的,双向连接的web应用,客户端和服务器端都可以发起通信,能够自由地交换数据…...

    2024/4/15 3:59:49
  10. 初学node.js(一)入门、KEPL的使用

    node.js是什么?Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架。具体详见1 百度百科node.js2 node.js官网Node.js - 环境安装配置安装设置Node.js环境,需要: 一、文本编辑器 二、Node.js二进制安装包node.js的安装就不在这里写了~~(下载安装包之后…...

    2024/4/15 3:59:49
  11. Node.js入门web应用(图片上传显示)

    Node.js简单入门简介文件结构代码运行总结 简介简单的Node.js入门demo 用来实现 文件的上传和显示,结合注释进行讲解 前提是已经安装好node.js,还没装的请自行百度安装教程,这里就不提供链接了 测试环境在 windows10 下面,代码在其他系统中的运行结果不知道会不会有一点误差…...

    2024/4/15 3:59:47
  12. Node.js 入门笔记(3) - bootstrap

    在hellonodejs的下建一个libs目录,将bootstrap的文件放到放到这目录下,在vscode下可以看到这些文件。bootstrap用的3.3.7,jquery用的v3.2.1。采用bootstrap进行布局的基本目标是在最上方显示一个导航条(主菜单),在导航条的下方是一个面包屑导航,接着是主区域,最后是脚注…...

    2024/4/15 3:59:46
  13. 《饿了么大前端 Node.js 进阶教程》—Javascript 基础问题—引用传递

    《饿了么大前端 Node.js 进阶教程》地址:https://github.com/ElemeFE/node-interview 1.如何编写一个 json 对象的拷贝函数function clone(obj){var result;if (Array.isArray(obj)) {result = [];obj.forEach((item) => {result.push(clone(item));});        } e…...

    2024/4/20 21:38:51
  14. Node.js教程第一篇—— Node.js 基础

    认识 Node.js Node 是一个服务器端 JavaScript 解释器 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效 Node.js 的包管理器 npm,是全球最大的开源库生态系统 Node.js 是一门动态语言,运行在服务…...

    2024/4/24 13:23:31
  15. node.js学习笔记

    1、什么是Node.js?Node.js是基于Chrome V8引擎而构建的JavaScript运行时环境,它让JavaScript可以运行于服务器端(之前只是运行在客户端,主要是浏览器);Node.js底层用C++实现的,大部分模块都使用JavaScript编写,含大量的内置模块,使得程序可以脱离Apache、Nginx、IIS等…...

    2024/4/24 13:23:29
  16. Node.js入门教程 第三篇 (模块、路由)

    Node.js的模块Node.js的模块与传统面向对象的类(class)不完全相同。Node.js认为文件即模块,即一个文件是一个模块。单一文件一般只专注做一件事情,保证了代码的简洁性。创建模块://test.jsexports.world = function() {console.log(Hello World);}引用模块(Node.js默认文…...

    2024/4/24 13:23:28
  17. 深入浅出Node.js

    深入浅出Node.js 一直想致力于写一篇关于广义讲解Node.js系统的文章,苦于时间有限,资源有限。这篇文章是在结合自己的学习心得以及与行业大佬共同探讨下争对于熟练掌握JS语言后的广义Node.js.至于为什么叫作广义在后文会提到。希望看到这篇文章后可以激发大家对Node.js的学习…...

    2024/4/24 13:23:28
  18. Node.js 入门你需要知道的 10 个问题

    本文为您分享「Node.js 入门你需要知道的 10 个问题」这些问题可能也是面试中会被问到的,当然问题不仅仅是这 10 道,因此,最近开源了一个新项目 Nodejs-Interview-Questions 专注于 Node.js 面试题的分享,提供了中英文版本,您也可以在线预览: https://interview.nodejs.re…...

    2024/4/24 13:23:26
  19. Node.js简单介绍和入门

    背景 最开始接触Node,是在没有接触PHP前,用于前端的服务。多按照各种教程使用npm的各种指令。时间一长,便决定得知其所以然,便特意了解一下。 此文与专栏下后续发布的其他博文,便是关于Node.js学习中的一些小结。让我们从介绍开始 按照Node.js 中文网的解释: Node.js 是一…...

    2024/4/24 13:23:25
  20. 如何通过饿了么 Node.js 面试

    如何通过饿了么 Node.js 面试Hi, 欢迎来到 ElemeFE, 如标题所示本教程的目的是教你如何通过饿了么大前端的面试, 职位是 2~3 年经验的 Node.js 服务端程序员 (并不是全栈), 如果你对这个职位感兴趣或者学习 Node.js 一些进阶的内容, 那么欢迎围观.需要注意的是, 本文针对的并不…...

    2024/4/24 13:23:27

最新文章

  1. Mac no library called “libcairo-2“ was found

    最近在运行ernibe-bot researcher的时候出现了下面的问题&#xff1a; OSError: no library called "cairo-2" was found no library called "cairo" was found no library called "libcairo-2" was found cannot load library libcairo.so.2: …...

    2024/5/2 7:50:25
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 最新在线工具箱网站系统源码

    内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上…...

    2024/5/1 13:29:34
  4. Linux系统下安装jdk与tomcat【linux】

    一、yum介绍 linux下的jdk安装以及环境配置&#xff0c;有两种常用方法&#xff1a; 1.使用yum一键安装。 2.手动安装&#xff0c;在Oracle官网下载好需要的jdk版本&#xff0c;上传解压并配置环境。 这里介绍第一种方法&#xff0c;在此之前简单了解下yum。 yum 介绍 yum&…...

    2024/5/1 14:51:50
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57