有关Node.js的安全更新以及Node.js v15的信息

有一个 Node.js 安全更新可用。

https://nodejs.org/en/ 的中文翻译为:

2月23日,由于发布了Node.js的新版本,所以让我们来进行检查吧。
https://nodejs.org/en/blog/vulnerability/february-2021-security-releases/

10.x、12.x、14.x和15.x的安全更新

重要(1), 高度(1), 低度(1)

    1. 当HTTP/2的unknownProtocol过多时,可能会遭受DoS攻击的问题。

 

    1. 存在文件系统泄露的可能性。

 

    1. 可能引发内存泄漏。

 

    1. 当localhost6包含在白名单中时,可能会遭受DoS攻击的问题。

 

    1. 如果/etc/hosts包含localhost6,则可能会受到此攻击的影响。

 

    通过Node.js利用OpenSSL的漏洞可能会发生问题。

我们应该适当地遵循(如果只是前端的话,感觉没什么大不了的)。

※Node.js 10.x 预计将于2021年4月30日结束支持,12.x系列预计于2022年4月30日结束支持。
※奇数版本用于功能开发,偶数版本用于长期支持。除了最新的15.x版本,不存在其他奇数版本。

关于Node.js的错误报告

nodejs-sec 群组
https://groups.google.com/g/nodejs-sec?pli=1

如何报告Bug
https://github.com/nodejs/node/blob/master/SECURITY.md

报告 Nodejs 的错误即可获得报酬的计划:错误赏金计划
https://hackerone.com/nodejs


关于Node.js v15的相关信息

由于我对Node.js v15没有跟得上,所以进行了一次复习。

https://nodejs.org/en/ 的中文释义如下:

v15 的发布日期是2020年10月21日。v16 会在2021年4月发布吧?

Node.js v15.0.0 正式发布

codedamn さんのまとめ YouTube のリンクは、https://www.youtube.com/watch?v=OIzGI5wFiXg です。

很整齐有条理

1. 包含 npm 7

我安装了npm 7。

以下是npm官方网站的链接:https://www.npmjs.com/package/npm

workspace という概念が入った

monorepo で作りたい時とかは便利そう

acceptDependencies という概念も入った

peerDependencies の挙動変更

npx が実行前に確認されるようになった

npm audit の表示方法が変更

package.exports が npm の内部モジュールを参照できないようになった

npm test の表示内容が変更

npm build と npm unbuild が廃止

以下是对《NPM v7的主要变更总结》一文的中文本地化版本:

https://blog.watilde.com/2020/10/14/npm-v7的主要变更总结/

2. 更改 unhandledRejection 的行为。

突破性变革!

unhandledRejection の挙動が変わった。default warn だったのが throw になった。

只是起初,当这件事发生的时候,以下是发生的时机。

Promise を使った非同期処理において想定外のエラーが起きた
エラーハンドリングが漏れている
単純なコードのエラー

由于程序变得糟糕,因此改变了行为,从而能够编写更安全的代码。

请提供一个只需要一种选项的句子翻译,这样助手才能更好地帮助您。

关于未处理的拒绝情况

关于”UnhandledRejection”的问题,请参考这篇文章:https://medium.com/@hagevvashi/unhandledrejectionについて-70739d2b6a60。

我认为当运营网站时,会使用Sentry来处理错误。

https://sentry.io/welcome/ 的欢迎界面。

window.onerror 不会捕获通过 Promise.reject() 抛出的错误(但会以 console.error() 的形式显示)

在检测和处理 Promise 错误时使用,例如在 Node.js 中进行文件操作或进行与浏览器中的 API 通信失败相关的 I/O 处理。

try {
  await axios.post("/some-resources");
} catch(e) {
  // error handling
  throw e; // this causes unhandled rejection
}
window.addEventListener("unhandledrejection", (e: PromiseRejectionEvent): void => {
  // an error loginng
  logError(e.reason);
});
process.on("unhandledRejection", (error: {} | null | undefined, promise: Promise<any>) => {
  // an error loging
  logError(error);
})

有关UnhandledRejection的内容,请参考以下链接:https://medium.com/@hagevvashi/unhandledrejectionについて-70739d2b6a60

3. 支持 ES2021

JavaScript引擎V8已升级至v8.6。虽然在浏览器中已经可以使用,所以并不稀奇。

任何一个承诺

当所有的 promise 都变为 resolved 状态时,或者任何一个 promise 变为 rejected 状态时,发生错误。

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'foo');
});

Promise.all([promise1, promise2, promise3])
  .then((values) => {
    console.log(values);
  })
  .catch(() => {
    console.log("error");
  });
// expected output: Array [3, 42, "foo"]

Promise.race是在任何一个Promise被解决或被拒绝时出现错误。
Promise.allSettled是在所有Promise被解决或被拒绝时,不会出现错误。
Promise.any是在任何一个Promise被解决时,或所有Promise被拒绝时出现错误。

在同时运行10个Promise时,即使有9个失败,只要最后一个成功,就视为成功(使用race会导致任何一个Promise被拒绝都会引发错误)。

弱引用

在垃圾回收过程中,能够创建可被销毁的对象。

以下是网站链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef

var ref = new WeakRef(element)
ref.deref() // 参照元を取り出す

我尝试简单地制作了一个样本。↓
https://playcode.io/740665/

计时器仍在运行。使用另一个计时器,在5秒后移除DOM元素。在原始计时器函数中仍可以引用。当进行垃圾回收时,引用将被清除并停止运行。

能写出防止内存泄漏的代码。

聚合错误

在需要整理多个错误时使用。

try {
  throw new AggregateError([
    new Error("some error"),
  ], 'Hello');
} catch (e) {
  console.log(e instanceof AggregateError); // true
  console.log(e.message);                   // "Hello"
  console.log(e.name);                      // "AggregateError"
  console.log(e.errors);                    // [ Error: "some error" ]
}

在中国,可以通过数组方式提供错误信息。

論理代入演算子是指邏輯運算符。

希望你停止,因为这样很难阅读。

let a = true
a &&= false // x && (x = y): x と y が true な値の場合、y の値が代入される
// false
a
// false
a ||= true // x || (x = y): x が false な値の場合、y の値が代入される
// true
a
// true
a = null
a ??= 1 // x ?? (x = y): x が null or undefined な値の場合、y の値が代入される
// 1
a
// 1
a ??= 2
// 1
a
// 1

数值分隔符

因为使用它能使数字更易读,所以要积极使用。

123 === 1_2_3
// true
1_000_000_000.000_001
// 1000000000.000001

我不想处理这么大的神奇数字,也感觉没有处理它的机会。

字符串原型中的所有替换

那個可以在瀏覽器上使用的東西。

以下是关于`String.replaceAll()`方法的文档链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll
此外,你可以参考该链接了解有关`String.replaceAll()`方法的浏览器兼容性:https://caniuse.com/mdn-javascript_builtins_string_replaceall

如果使用Babel工具,IE 11可以将使用replaceAll方法的代码进行转译。通过使用preset-env (core-js),可以在IE 11上实现兼容。

https://v8.dev/features/string-replaceall 的功能是替换字符串的全部匹配项。

顺便提一下,Next.js 没有安装 @babel/preset-env,所以如果要支持 IE11,需要在配置文件中指定。

4. 网络加密API

一种基于Web标准的JavaScript API可以实现加密、解密、签名和验证功能。

可以使用的加密库
(https://caniuse.com/cryptography)

在浏览器中,早就能使用的功能。
Node 最近可以在浏览器中使用一些过去可以使用的功能,这是一个好消息。

5. 中止控制器

在 Node.js 15 中,可以使用 AbortController 这个全局工具对象来中止 Web 请求。

const ac = new AbortController();
ac.signal.addEventListener('abort', () => console.log('Aborted!'),
{ once: true });
ac.abort();
console.log(ac.signal.aborted);  // Prints True

取消下载视频的事例

请以中文使用原生语言将以下内容改述:
https://developer.mozilla.org/en-US/docs/Web/API/AbortController

var controller = new AbortController();
var signal = controller.signal;

var downloadBtn = document.querySelector('.download');
var abortBtn = document.querySelector('.abort');

downloadBtn.addEventListener('click', fetchVideo);

abortBtn.addEventListener('click', function() {
  controller.abort();
  console.log('Download aborted');
});

function fetchVideo() {
  ...
  fetch(url, {signal}).then(function(response) {
    ...
  }).catch(function(e) {
    reports.textContent = 'Download error: ' + e.message;
  })
}

虽然Fetch在Node.js中尚未实现,但是嘛。

在前端 UI 开发中,如果我们在按钮上使用 `mousedown/mouseup` 事件进行 `addEventListen`,并且由于点击后会触发页面跳转,我们想要在点击后取消事件监听,可以使用 `abortController` 来解除,这个技巧在某处被介绍过。

6. 事件目标

在浏览器上可用的EventTarget现在也可以在Node.js中使用了。事件的发布和传播在浏览器中使用EventTarget,在Node.js中使用EventEmitter。

请提供一个选项来以中文本地化地释义以下网址:https://nodejs.org/api/events.html#events_eventtarget_and_event_api。

const target = new EventTarget();

target.addEventListener("foo", (event) => {
  console.log("foo is called");
});

const ev = new Event("foo");
target.dispatchEvent(ev);

尽管事件的传播在DOM树中可能有所不同,但我们已经能够编写出通用的程序。

7. N-API已更新

Node.js的原生扩展Node API(也称为N-API)已经更新。它使用C语言接口。嗯,可能不太常用吧。

请提供一个中文选项: https://nodejs.org/api/n-api.html#n_api_node_api

8. QUIC(实验性功能)

现在可以使用基于UDP的通信协议“QUIC”了。它基于TLS 1.3,具备安全性、流量控制、错误校正、连接和多路复用等等功能。

TLS 1.3 是什么:https://kinsta.com/jp/blog/tls-1-3/

可以创建HTTP/3服务器。
https://blog.leko.jp/post/http-over-quic-on-nodejs15/

太难理解了,实在搞不明白呢。

感想

    せめて Node.js 14.x にはしとこう
广告
将在 10 秒后关闭
bannerAds