跳到主要内容

node 最佳实践

异步

使用 promise 简易封装 child_process

import { spawn } from "child_process";

export const spawnAsPromised = (command:string, args:string[], options:object) => {
return new Promise( (resolve, reject) {
let stdout = "";
let stderr = "";
const cp = spawn(command, args, options);
cp.stdout.on("data", (chunk) {
stdout += chunk;
});
cp.stderr.on("error", (chunk) {
stderr += chunk;
});
cp.on("close", (code) {
if (code === 0) {
resolve(stdout);
} else {
reject(stderr);
}
});
});
};

模块

zlib 模块

服务器使用 gzip
import fs from "fs";
import zlib from "zlib";

// 压缩文件
const gzip = zlib.createGzip();
res.writeHead(200, {
"Content-Encoding": "gzip",
});
pipeline(filepath, gzip, res, (err) => {
if (err) {
console.error("An error occurred:", err);
process.exitCode = 1;
}
});

// 压缩字符串
res.writeHead(200, {
"Content-Encoding": "gzip",
});
zlib.gzip(responseText, (err, result) => {
res.end(result.toString());
});

fs 模块

动态请求返回静态文件
// 常用于图片, 视频等二进制文件传输
import fs from "fs";
const getMesh = async (req: Request, res: Response) => {
const filePath = await dataService.getMesh(req.query.id as string);
// 读取文件
const content = fs.readFileSync(filePath, "binary");
// 发送
res.writeHead(200, "ok");
res.write(content, "binary");
// 结束
res.status(200).end();
};
动态请求返回文件流
// 常用于图片, 视频等二进制文件传输
import fs from "fs";
const getMesh = async (req: Request, res: Response) => {
const filePath = await dataService.getMesh(req.query.id as string);
// 创建文件流, 异步操作
const cs = fs.createReadStream(filePath);
// 监听 data 事件, 不断写入数据
cs.on("data", (chunk) => {
res.write(chunk);
});
// 监听 end 事件, 返回 http 请求
cs.on("end", () => {
res.status(200).end();
});
};

net 模块

服务器端 + 客户端示例

服务器端
import net from "net";

const server = net.createServer();

server.on("connection", (socket) => {
socket.on("data", (buffer) => {
console.log("data: ", buffer.toString());
socket.write("server data");
});

socket.on("connect", () => {
console.log("TCP connection connect.");
});

socket.on("end", () => {
console.log("TCP connection end.");
});
});

server.on("error", (err) => {
console.log(err.message);
});

server.on("close", () => {
console.log("TCP server stop.");
});

server.listen(1122, () => {
console.log("TCP server start.");
});
客户端
import net from "net";

const client = net.createConnection(1122);

client.on("data", (buffer) => {
console.log("data: ", buffer.toString());
client.end();
});

client.on("connect", () => {
console.log("TCP connection connect.");
});

client.on("end", () => {
console.log("TCP connection end.");
});

client.write("client data");

dgram 模块

服务器端 + 客户端示例

服务器端
import dgram from "dgram";

const server = dgram.createSocket("udp4");

server.on("message", (buffer, rinfo) => {
console.log(buffer.toString());
});

server.on("error", (err) => {
console.log(err.message);
});

server.on("close", () => {
console.log("Server close.");
});

server.bind(1908, () => {
console.log("Server start.");
});
客户端
import dgram from "dgram";

const client = dgram.createSocket("udp4");

client.connect(1908, () => {
client.send("send", () => {
client.close();
});
});
client.on("close", () => {
console.log("client close.");
});