参加字节跳动的青训营时写的笔记。这部分是欧阳亚东老师讲的课。
const http = require("http");
const port = 8081;
const server = http.createServer((req, res) => {
res.end("Hello");
});
server.listen(port, () => {
console.log(`Listen at ${port}`);
});
用户把 JSON 数据 POST 给服务器,服务器再把数据中的 msg 取出来,返回给用户
服务器端:
const http = require("http");
const server = http.createServer((req, res) => {
const bufs = [];
req.on("data", (buf) => {
bufs.push(buf); // 把数据收集起来
});
req.on("end", () => {
const buf = Buffer.concat(bufs).toString("utf8");
let msg = "Hello";
try {
const ret = JSON.parse(buf); // 转换成JSON对象
msg = ret.msg;
} catch (err) {
// 如果抛出异常的话,则msg是初始值Hello,无需处理异常
}
const responseJson = {
msg: `receive: ${msg}`,
};
res.setHeader("Content-Type", "application/json");
res.end(JSON.stringify(responseJson)); // JSON对象转换为字符串
});
});
const port = 8081;
server.listen(port, () => {
console.log(`Listen at ${port}`);
});
客户端:
const http = require("http");
const body = JSON.stringify({
msg: "Hello from client",
});
const req = http.request(
"http:/127.0.0.1:8081",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
},
(res) => {
const bufs = [];
res.on("data", (buf) => {
bufs.push(buf);
});
res.on("end", () => {
const buf = Buffer.concat(bufs);
const json = JSON.parse(buf);
console.log("json msg is: ", json.msg);
});
}
);
req.end(body);
先打开服务器端,再打开客户端。(第一个文件为 json.js,第二个为 client.js。则先执行 node json.js
,再执行 node client.js
)
收到返回信息:
技巧:将 callback 转换成 promise
不是所有的回调函数都适合转换成 promise,而是只调用一次的回调函数才适合转换为 promise。即 createServer()不适合转换为 promise。
json.js 修改后(输出结果一样)
const http = require("http");
const server = http.createServer(async (req, res) => {
// 从客户端接收数据
const msg = await new Promise((resolve, reject) => {
const bufs = [];
req.on("error", (err) => {
reject(err);
});
req.on("data", (buf) => {
bufs.push(buf); // 把数据收集起来
});
req.on("end", () => {
const buf = Buffer.concat(bufs).toString("utf8");
let msg = "Hello";
try {
const ret = JSON.parse(buf); // 转换成JSON对象
msg = ret.msg;
} catch (err) {
// console.log(err);
}
resolve(msg); // 返回msg
});
});
// 响应
const responseJson = {
msg: `receive: ${msg}`,
};
res.setHeader("Content-Type", "application/json");
res.end(JSON.stringify(responseJson));
});
const port = 8081;
server.listen(port, () => {
console.log(`Listen at ${port}`);
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<p>Hello</p>
<script>
alert("Hello");
</script>
</body>
</html>
static_server.js
const http = require("http");
const fs = require("fs");
const path = require("path");
const url = require("url");
const folderPath = path.join(__dirname, "static");
const server = http.createServer((req, res) => {
const info = url.parse(req.url);
const filePath = path.join(folderPath, info.path);
const filestream = fs.createReadStream(filePath);
// createReadStream好处: 减少占用内存空间
filestream.pipe(res);
});
const port = 8081;
server.listen(port, () => {
console.log(`Listen at ${port}`);
});
执行 node static_server.js
后,打开 http://localhost:8081/index.html
之后会报点小错,因为没有 ico 图标(忽视就好)
SSR(server side rendering):服务端渲染
首先要先安装 react 相关的包, npm i react react-dom
下面就是通过 React SSR 实现显示 Hello 的代码(有一点不太明白,还是得等会用 ReactDOM、ReactDOMServer 模块)
ssr.
const React = require("react");
const ReactDOMServer = require("react-dom/server");
const http = require("http");
function App(props) {
return React.createElement("div", {}, props.children || "Hello");
}
const port = 8081;
const server = http.createServer((req, res) => {
res.end(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>App</title>
</head>
<body>
${ReactDOMServer.renderToString(React.createElement(App, {}, "Hello"))}
</body>
</html>
`);
});
server.listen(port, () => {
console.log(`Listen at ${port}`);
});
V8 Inspector:开箱即用、与前端开发已知、跨平台
场景:
使用:
node --inspect ssr.js
控制台显示连接上