Jadual Kandungan
Apakah itu RPC?
RPC lwn HTTP
paket data binari codec penimbal
Buat penimbal
Tulis sesuatu ke dalam penimbal
Bagaimanakah binari yang dihantar oleh RPC mewakili medan yang diluluskan?
net建立RPC通道
半双工通信
全双工通信
错位处理
粘包处理
Rumah hujung hadapan web tutorial js Apakah RPC? Mari kita bincangkan tentang cara melaksanakan komunikasi RPC dalam nod

Apakah RPC? Mari kita bincangkan tentang cara melaksanakan komunikasi RPC dalam nod

Nov 03, 2022 pm 08:21 PM
node.js rpc

Apakah RPC? Mari kita bincangkan tentang cara melaksanakan komunikasi RPC dalam nod

[Cadangan tutorial berkaitan: tutorial video nodejs]

Apakah itu RPC?

RPC: Panggilan Prosedur Jauh merujuk kepada panggilan prosedur jauh, iaitu, terdapat dua pelayan A dan B. Aplikasi digunakan pada pelayan A dan anda ingin memanggil aplikasi pada pelayan B .

Komunikasi antara pelayan

RPC lwn HTTP

Mata yang sama

  • Ia adalah semua komunikasi rangkaian antara dua komputer. Ajax ialah komunikasi antara penyemak imbas dan pelayan, RPC ialah komunikasi antara pelayan dan pelayan
  • Kedua-dua pihak perlu bersetuju dengan format data

Perbezaan

  • Pelayan pengalamatan adalah berbeza

ajax Ia menggunakan DNS sebagai perkhidmatan pengalamatan untuk mendapatkan alamat IP yang sepadan dengan nama domain pelayar menghantar permintaan selepas mendapat alamat IP Dapatkan data.

RPC secara amnya meminta satu sama lain dalam intranet, jadi ia biasanya tidak menggunakan DNS untuk menangani perkhidmatan. Kerana ia berada pada rangkaian dalaman, anda boleh menggunakan ID tertentu atau VIP maya, seperti v5:8001, dan kemudian pergi ke pelayan pengalamatan untuk mendapatkan alamat IP yang sepadan dengan v5.

  • Protokol lapisan aplikasi adalah berbeza

ajaxGunakan protokol http, iaitu protokol teks Apabila kita berinteraksi dengan data, format fail sama ada html atau json object , apabila menggunakan json, ia adalah dalam bentuk key-value.

RPCMenggunakan protokol binari. Menggunakan penghantaran binari, paket yang dihantar kelihatan seperti ini [0001 0001 0111 0110 0010], yang semuanya binari Secara amnya, digit tersebut digunakan untuk mewakili medan Contohnya, 6 digit pertama adalah medan, dan seterusnya.

Dengan cara ini tidak perlu http untuk menghantar kunci dalam objek json, jadi volum data lebih kecil.

Oleh kerana penghantaran adalah binari, ia lebih sesuai untuk difahami oleh komputer, dan protokol teks lebih sesuai untuk pemahaman manusia, jadi masa yang diperlukan komputer untuk mentafsir setiap medan adalah lebih kurang daripada protokol teks.

RPC menggunakan binari, yang mempunyai volum data yang lebih kecil dan kelajuan tafsiran yang lebih pantas.

  • Kaedah komunikasi TCP
  • Komunikasi ringkas: Hanya pelanggan boleh menghantar mesej kepada pelayan, atau hanya pelayan boleh menghantar mesej kepada pelayan. Pelanggan menghantar mesej

  • Komunikasi separuh dupleks: Dalam tempoh masa tertentu, hanya pelanggan boleh menghantar mesej kepada pelayan Selepas tempoh ini, pelayan boleh menghantar mesej kepada klien. Jika masa dibahagikan kepada beberapa bahagian masa, dalam satu bahagian masa ia adalah komunikasi simpleks

  • Komunikasi dupleks penuh: klien dan pelayan boleh berkomunikasi antara satu sama lain

Faktor utama yang perlu dipertimbangkan semasa memilih salah satu daripada tiga kaedah komunikasi ini ialah: kesukaran pelaksanaan dan kos. Komunikasi dupleks penuh adalah lebih mahal daripada komunikasi separuh dupleks Dalam sesetengah senario, komunikasi separuh dupleks masih boleh dipertimbangkan.

ajax ialah komunikasi separuh dupleks. http ialah protokol teks, tetapi lapisan bawahnya ialah protokol tcp Teks http akan menjalani proses penukaran daripada aliran data binari kepada teks pada lapisan tcp.

PemahamanRPC hanyalah pemahaman yang lebih mendalam tentang teknologi hadapan.

paket data binari codec penimbal

Buat penimbal

penampan.daripada: daripada Beberapa data cipta binari

const buffer1 = Buffer.from('geekbang')
const buffer2 = Buffer.from([0, 1, 2, 3, 4])


<Buffer 67 65 65 6b 62 61 6e 67>
<Buffer 00 01 02 03 04>
Salin selepas log masuk

buffer.alloc: Cipta binari kosong

const buffer3 = Buffer.alloc(20)

<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
Salin selepas log masuk

Tulis sesuatu ke dalam penimbal

  • buffer.write(string, offset): Tulis rentetan
  • buffer.writeInt8(value, offset): int8 mewakili integer yang boleh diwakili oleh binari 8 bit (8 bit mewakili bait), sebelum offset mula menulis Bilangan bait untuk dilangkau.
  • buffer.writeInt16BE(value, offset): int16 (dua bait), mewakili integer yang boleh diwakili oleh 16 bit binari, iaitu 32767. Program ini akan melaporkan ralat jika melebihi jumlah ini.
const buffer = Buffer.from([1, 2, 3, 4]) // <Buffer 01 02 03 04>

// 往第二个字节里面写入12
buffer.writeInt8(12, 1) // <Buffer 01 0c 03 04>
Salin selepas log masuk

Big-endian BE dan little-endian LE: Terutamanya disebabkan oleh susunan data yang berbeza lebih daripada 2 bait (writeInt8 hanya mempunyai satu bait, jadi ada bukan endian besar Endian dan endian kecil), dalam endian besar, alamat tertib rendah diletakkan dalam bit tertib tinggi, dan dalam endian kecil, alamat tertib rendah diletakkan dalam bit tertib rendah. Seperti berikut:

const buffer = Buffer.from([1, 2, 3, 4])

buffer.writeInt16BE(512, 2) // <Buffer 01 02 02 00>
buffer.writeInt16LE(512, 2) // <Buffer 01 02 00 02>
Salin selepas log masuk

Bagaimanakah binari yang dihantar oleh RPC mewakili medan yang diluluskan?

Bagaimanakah binari yang dihantar oleh PC mewakili medan? Kini terdapat pakej binari [00, 00, 00, 00, 00, 00, 00]. Kami menganggap bahawa tiga bait pertama mewakili nilai medan, dua bait seterusnya mewakili nilai medan, dan dua bait terakhir. juga mewakili nilai sesuatu medan. Kaedah penulisan adalah seperti berikut:

writeInt16BE(value, 0)
writeInt16BE(value, 2)
writeInt16BE(value, 4)
Salin selepas log masuk

发现像这样写,不仅要知道写入的值,还要知道值的数据类型,这样就很麻烦。不如json格式那么方便。针对这种情况业界也有解决方案。npm有个库protocol-buffers,把我们写的参数转化为buffer

// test.proto 定义的协议文件
message Column {
  required float num  = 1;
  required string payload = 2;
}
// index.js
const fs = require(&#39;fs&#39;)
var protobuf = require(&#39;protocol-buffers&#39;)
var messages = protobuf(fs.readFileSync(&#39;test.proto&#39;))

var buf = messages.Column.encode({
	num: 42,
	payload: &#39;hello world&#39;
})
console.log(buf)
// <Buffer 0d 00 00 28 42 12 0b 68 65 6c 6c 6f 20 77 6f 72 6c 64>

var obj = messages.Column.decode(buf)
console.log(obj)
// { num: 42, payload: &#39;hello world&#39; }
Salin selepas log masuk

net建立RPC通道

半双工通信

服务端代码:

const net = require(&#39;net&#39;)

const LESSON_DATA = {
  136797: &#39;01 | 课程介绍&#39;,
  136798: &#39;02 | 内容综述&#39;,
  136799: &#39;03 | Node.js是什么?&#39;,
  136800: &#39;04 | Node.js可以用来做什么?&#39;,
  136801: &#39;05 | 课程实战项目介绍&#39;,
  136803: &#39;06 | 什么是技术预研?&#39;,
  136804: &#39;07 | Node.js开发环境安装&#39;,
  136806: &#39;08 | 第一个Node.js程序:石头剪刀布游戏&#39;,
  136807: &#39;09 | 模块:CommonJS规范&#39;,
  136808: &#39;10 | 模块:使用模块规范改造石头剪刀布游戏&#39;,
  136809: &#39;11 | 模块:npm&#39;,
  141994: &#39;12 | 模块:Node.js内置模块&#39;,
  143517: &#39;13 | 异步:非阻塞I/O&#39;,
  143557: &#39;14 | 异步:异步编程之callback&#39;,
  143564: &#39;15 | 异步:事件循环&#39;,
  143644: &#39;16 | 异步:异步编程之Promise&#39;,
  146470: &#39;17 | 异步:异步编程之async/await&#39;,
  146569: &#39;18 | HTTP:什么是HTTP服务器?&#39;,
  146582: &#39;19 | HTTP:简单实现一个HTTP服务器&#39;
}

const server = net.createServer(socket => {
  // 监听客户端发送的消息
  socket.on(&#39;data&#39;, buffer => {
    const lessonId = buffer.readInt32BE()
    setTimeout(() => {
      // 往客户端发送消息
      socket.write(LESSON_DATA[lessonId])
    }, 1000)
  })
})

server.listen(4000)
Salin selepas log masuk

客户端代码:

const net = require(&#39;net&#39;)

const socket = new net.Socket({})

const LESSON_IDS = [
  &#39;136797&#39;,
  &#39;136798&#39;,
  &#39;136799&#39;,
  &#39;136800&#39;,
  &#39;136801&#39;,
  &#39;136803&#39;,
  &#39;136804&#39;,
  &#39;136806&#39;,
  &#39;136807&#39;,
  &#39;136808&#39;,
  &#39;136809&#39;,
  &#39;141994&#39;,
  &#39;143517&#39;,
  &#39;143557&#39;,
  &#39;143564&#39;,
  &#39;143644&#39;,
  &#39;146470&#39;,
  &#39;146569&#39;,
  &#39;146582&#39;
]

socket.connect({
  host: &#39;127.0.0.1&#39;,
  port: 4000
})

let buffer = Buffer.alloc(4)
buffer.writeInt32BE(LESSON_IDS[Math.floor(Math.random() * LESSON_IDS.length)])

// 往服务端发送消息
socket.write(buffer)

// 监听从服务端传回的消息
socket.on(&#39;data&#39;, buffer => {
  console.log(buffer.toString())

  // 获取到数据之后再次发送消息
  buffer = Buffer.alloc(4)
  buffer.writeInt32BE(LESSON_IDS[Math.floor(Math.random() * LESSON_IDS.length)])

  socket.write(buffer)
})
Salin selepas log masuk

以上半双工通信步骤如下:

  • 客户端发送消息 socket.write(buffer)
  • 服务端接受消息后往客户端发送消息 socket.write(buffer)
  • 客户端接受消息后再次发送消息

这样在一个时间端之内,只有一个端往另一个端发送消息,这样就实现了半双工通信。那如何实现全双工通信呢,也就是在客户端往服务端发送消息的同时,服务端还没有消息返回给客户端之前,客户端又发送了一个消息给服务端。

全双工通信

先来看一个场景:

Apakah RPC? Mari kita bincangkan tentang cara melaksanakan komunikasi RPC dalam nod

客户端发送了一个id1的请求,但是服务端还来不及返回,接着客户端又发送了一个id2的请求。

等了一个之后,服务端先把id2的结果返回了,然后再把id1的结果返回。

那如何结果匹配到对应的请求上呢?

如果按照时间顺序,那么id1的请求对应了id2的结果,因为id2是先返回的;id2的请求对应了id1的结果,这样就导致请求包和返回包错位的情况。

怎么办呢?

我们可以给请求包和返回包都带上序号,这样就能对应上。

错位处理

客户端代码:

socket.on(&#39;data&#39;, buffer => {
  // 包序号
  const seqBuffer = buffer.slice(0, 2)
  // 服务端返回的内容
  const titleBuffer = buffer.slice(2)
    
  console.log(seqBuffer.readInt16BE(), titleBuffer.toString())
})

// 包序号
let seq = 0
function encode(index) {
  // 请求包的长度现在是6 = 2(包序号) + 4(课程id)
  buffer = Buffer.alloc(6)
  buffer.writeInt16BE(seq)
  buffer.writeInt32BE(LESSON_IDS[index], 2)

  seq++
  return buffer
}

// 每50ms发送一次请求
setInterval(() => {
  id = Math.floor(Math.random() * LESSON_IDS.length)
  socket.write(encode(id))
}, 50)
Salin selepas log masuk

服务端代码:

const server = net.createServer(socket => {
  socket.on(&#39;data&#39;, buffer => {
    // 把包序号取出
    const seqBuffer = buffer.slice(0, 2)
    // 从第2个字节开始读取
    const lessonId = buffer.readInt32BE(2)
    setTimeout(() => {
      const buffer = Buffer.concat([
        seqBuffer,
        Buffer.from(LESSON_DATA[lessonId])
      ])
      socket.write(buffer)
      // 这里返回时间采用随机的,这样就不会按顺序返回,就可以测试错位的情况
    }, 10 + Math.random() * 1000)
  })
})
Salin selepas log masuk
  • 客户端把包序号和对应的id给服务端
  • 服务端取出包序号和对应的id,然后把包序号和id对应的内容返回给客户端,同时设置返回的时间是随机的,这样就不会按照顺序返回。

粘包处理

如果我们这样发送请求:

for (let i = 0; i < 100; i++) {
  id = Math.floor(Math.random() * LESSON_IDS.length)
  socket.write(encode(id))
}
Salin selepas log masuk

我们发现服务端接收到的信息如下:

<Buffer 00 00 00 02 16 64 00 01 00 02 16 68 00 02 00 02 31 1c 00 03 00 02 3c 96 00 04 00 02 16 68 00 05 00 02 16 5e 00 06 00 02 16 66 00 07 00 02 16 67 00 08 ... 550 more bytes>
Salin selepas log masuk

这是因为TCP自己做的一个优化,它会把所有的请求包拼接在一起,这样就会产生粘包的现象。

服务端需要把包进行拆分,拆分成100个小包。

那如何拆分呢?

首先客户端发送的数据包包括两部分:定长的包头和不定长的包体

包头又分为两部分:包序号及包体的长度。只有知道包体的长度,才能知道从哪里进行分割。

let seq = 0
function encode(data) {
    // 正常情况下,这里应该是使用 protocol-buffers 来encode一段代表业务数据的数据包
    // 为了不要混淆重点,这个例子比较简单,就直接把课程id转buffer发送
    const body = Buffer.alloc(4);
    body.writeInt32BE(LESSON_IDS[data.id]);

    // 一般来说,一个rpc调用的数据包会分为定长的包头和不定长的包体两部分
    // 包头的作用就是用来记载包的序号和包的长度,以实现全双工通信
    const header = Buffer.alloc(6); // 包序号占2个字节,包体长度占4个字节,共6个字节
    header.writeInt16BE(seq)
    header.writeInt32BE(body.length, 2);

    // 包头和包体拼起来发送
    const buffer = Buffer.concat([header, body])

    console.log(`包${seq}传输的课程id为${LESSON_IDS[data.id]}`);
    seq++;
    return buffer;
}

// 并发
for (let i = 0; i < 100; i++) {
    id = Math.floor(Math.random() * LESSON_IDS.length)
    socket.write(encode({ id }))
}
Salin selepas log masuk

服务端进行拆包

const server = net.createServer(socket => {
  let oldBuffer = null
  socket.on(&#39;data&#39;, buffer => {
    // 把上一次data事件使用残余的buffer接上来
    if (oldBuffer) {
      buffer = Buffer.concat([oldBuffer, buffer])
    }
    let packageLength = 0
    // 只要还存在可以解成完整包的包长
    while ((packageLength = checkComplete(buffer))) {
      // 确定包的长度后进行slice分割
      const package = buffer.slice(0, packageLength)
      // 剩余的包利用循环继续分割
      buffer = buffer.slice(packageLength)

      // 把这个包解成数据和seq
      const result = decode(package)

      // 计算得到要返回的结果,并write返回
      socket.write(encode(LESSON_DATA[result.data], result.seq))
    }

    // 把残余的buffer记下来
    oldBuffer = buffer
  })
})
Salin selepas log masuk

checkComplete 函数的作用来确定一个数据包的长度,然后进行分割:

function checkComplete(buffer) {
  // 如果包的长度小于6个字节说明只有包头,没有包体,那么直接返回0
  if (buffer.length <= 6) {
    return 0
  }
  // 读取包头的第二个字节,取出包体的长度
  const bodyLength = buffer.readInt32BE(2)
  // 请求包包括包头(6个字节)和包体body
  return 6 + bodyLength
}
Salin selepas log masuk

decode对包进行解密:

function decode(buffer) {
  // 读取包头
  const header = buffer.slice(0, 6)
  const seq = header.readInt16BE()
    
  // 读取包体  
  // 正常情况下,这里应该是使用 protobuf 来decode一段代表业务数据的数据包
  // 为了不要混淆重点,这个例子比较简单,就直接读一个Int32即可
  const body = buffer.slice(6).readInt32BE()

  // 这里把seq和数据返回出去
  return {
    seq,
    data: body
  }
}
Salin selepas log masuk

encode把客户端想要的数据转化为二进制返回,这个包同样包括包头和包体,包头又包括包需要包序号和包体的长度。

function encode(data, seq) {
  // 正常情况下,这里应该是使用 protobuf 来encode一段代表业务数据的数据包
  // 为了不要混淆重点,这个例子比较简单,就直接把课程标题转buffer返回
  const body = Buffer.from(data)

  // 一般来说,一个rpc调用的数据包会分为定长的包头和不定长的包体两部分
  // 包头的作用就是用来记载包的序号和包的长度,以实现全双工通信
  const header = Buffer.alloc(6)
  header.writeInt16BE(seq)
  header.writeInt32BE(body.length, 2)

  const buffer = Buffer.concat([header, body])

  return buffer
}
Salin selepas log masuk

当客户端收到服务端发送的包之后,同样也要进行拆包,因为所有的包同样都粘在一起了:

 <Buffer 00 00 00 00 00 1d 30 36 20 7c 20 e4 bb 80 e4 b9 88 e6 98 af e6 8a 80 e6 9c af e9 a2 84 e7 a0 94 ef bc 9f 00 01 00 00 00 1d 30 36 20 7c 20 e4 bb 80 e4 ... 539 more bytes>
Salin selepas log masuk

因此,客户端也需要拆包,拆包策略与服务端的拆包策略是一致的:

let oldBuffer = null
socket.on(&#39;data&#39;, buffer => {
  // 把上一次data事件使用残余的buffer接上来
  if (oldBuffer) {
    buffer = Buffer.concat([oldBuffer, buffer])
  }
  let completeLength = 0

  // 只要还存在可以解成完整包的包长
  while ((completeLength = checkComplete(buffer))) {
    const package = buffer.slice(0, completeLength)
    buffer = buffer.slice(completeLength)

    // 把这个包解成数据和seq
    const result = decode(package)
    console.log(`包${result.seq},返回值是${result.data}`)
  }

  // 把残余的buffer记下来
  oldBuffer = buffer
})
Salin selepas log masuk

到这里就实现了双全工通行,这样客户端和服务端随时都可以往对方发小消息了。

更多node相关知识,请访问:nodejs 教程

Atas ialah kandungan terperinci Apakah RPC? Mari kita bincangkan tentang cara melaksanakan komunikasi RPC dalam nod. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian kepada ketidakupayaan untuk menyambung ke pelayan RPC dan ketidakupayaan untuk memasuki desktop Penyelesaian kepada ketidakupayaan untuk menyambung ke pelayan RPC dan ketidakupayaan untuk memasuki desktop Feb 18, 2024 am 10:34 AM

Apakah yang perlu saya lakukan jika pelayan RPC tidak tersedia dan tidak boleh diakses pada desktop Dalam beberapa tahun kebelakangan ini, komputer dan Internet telah menembusi setiap sudut kehidupan kita. Sebagai teknologi untuk pengkomputeran berpusat dan perkongsian sumber, Panggilan Prosedur Jauh (RPC) memainkan peranan penting dalam komunikasi rangkaian. Walau bagaimanapun, kadangkala kita mungkin menghadapi situasi di mana pelayan RPC tidak tersedia, mengakibatkan ketidakupayaan untuk memasuki desktop. Artikel ini akan menerangkan beberapa kemungkinan punca masalah ini dan memberikan penyelesaian. Pertama, kita perlu memahami mengapa pelayan RPC tidak tersedia. Pelayan RPC ialah a

Artikel tentang kawalan memori dalam Node Artikel tentang kawalan memori dalam Node Apr 26, 2023 pm 05:37 PM

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Mar 29, 2023 pm 06:02 PM

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Mari bercakap secara mendalam tentang modul Fail dalam Node Mari bercakap secara mendalam tentang modul Fail dalam Node Apr 24, 2023 pm 05:49 PM

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Mari kita bincangkan tentang gelung acara dalam Node Mari kita bincangkan tentang gelung acara dalam Node Apr 11, 2023 pm 07:08 PM

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.

Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Apakah yang perlu saya lakukan jika nod tidak boleh menggunakan arahan npm? Feb 08, 2023 am 10:09 AM

Sebab mengapa nod tidak boleh menggunakan arahan npm adalah kerana pembolehubah persekitaran tidak dikonfigurasikan dengan betul Penyelesaiannya ialah: 1. Buka "Sistem Sifat"; 2. Cari "Pembolehubah Persekitaran" -> "Pembolehubah Sistem", dan kemudian edit persekitaran. pembolehubah; 3. Cari lokasi folder nodejs;

Ketahui lebih lanjut tentang Penampan dalam Node Ketahui lebih lanjut tentang Penampan dalam Node Apr 25, 2023 pm 07:49 PM

Pada mulanya, JS hanya berjalan pada bahagian penyemak imbas Mudah untuk memproses rentetan berkod Unikod, tetapi sukar untuk memproses rentetan binari dan bukan berkod Unikod. Dan binari ialah format data peringkat terendah komputer, video/audio/program/pakej rangkaian

Artikel untuk membincangkan cara membangunkan aplikasi Node.js lapisan pembentangan dengan cekap Artikel untuk membincangkan cara membangunkan aplikasi Node.js lapisan pembentangan dengan cekap Apr 17, 2023 pm 07:02 PM

Bagaimana untuk menggunakan Node.js untuk pembangunan aplikasi bahagian hadapan? Artikel berikut akan memperkenalkan anda kepada kaedah membangunkan aplikasi bahagian hadapan dalam Node, yang melibatkan pembangunan aplikasi lapisan pembentangan. Penyelesaian yang saya kongsikan hari ini adalah untuk senario mudah Ia direka untuk membolehkan pembangun bahagian hadapan menyelesaikan beberapa tugas pembangunan bahagian pelayan yang mudah tanpa perlu menguasai terlalu banyak pengetahuan latar belakang dan pengetahuan profesional tentang Node.js, walaupun mereka tidak mempunyai pengekodan. pengalaman.

See all articles