Node 搭建 Web 服务器
简易服务器代码:app.js
js
/**
1.如何通过原生NodeJS搭建Web服务器
2.如何处理Get请求, 如何处理POST请求
3.如何处理不同路径(路由)
4.如何处理(获取)请求参数
*/
// 1.导入http模块
const http = require("http");
const queryString = require("querystring");
// 2.通过http模块创建服务对象
const server = http.createServer();
/**
* 3.通过服务对象监听用户请求
*/
server.on("request", (req, res) => {
console.log("接收到请求");
// 1.获取请求类型
let method = req.method.toLowerCase();
// 2.获取请求路径
let url = req.url;
let path = url.split("?")[0];
// 3.获取请求参数
let params = "";
if (method === "get") {
// 4.处理请求参数
params = url.split("?")[1];
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
// console.log('处理登录请求', params);
// 1.告诉客户端返回的数据是什么类型
res.writeHead(200, {
// 'Content-Type': 'text/plain; charset=utf-8;' // utf-8数据类型
"Content-Type": "application/json;", // json数据类型
});
// 2.告诉客户端返回的数据是什么
// res.end('www.it666.com 知播渔');
res.end(JSON.stringify({ name: "lnj", age: 33 }));
} else if (path === "/register") {
console.log("处理注册请求", params);
}
} else if (method === "post") {
// 4.处理请求参数
req.on("data", (chuck) => {
params += chuck;
});
// 4.1 接收完成请求传递的参数数据
req.on("end", () => {
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
console.log("post处理登录请求", params);
} else if (path === "/register") {
console.log("post处理注册请求", params);
}
});
}
});
// 4.指定监听的端口号
server.listen(3000);
Node 项目热重载运行
nodemon - 项目热重载运行库:每次修改代码后,自动重启项目
项目安装:npm install nodemon --save-dev
- 项目安装启动:
npx nodemon app.js
- 项目安装启动:
全局安装:npm install nodemon -g
- 全局安装启动项目:
nodemon app.js
- 全局安装启动项目:
Node 原生编写:读取静态资源服务
静态资源服务,文件:staticServer.js
js
const path = require("path");
const fs = require("fs");
const mime = require("./mime"); // mime文件后缀定义
/**
* 读取静态资源
* @param req 请求对象
* @param res 响应对象
* @param rootPath 静态资源所在的目录
*/
function readFile(req, res, rootPath) {
// 1.获取静态资源地址
// http://127.0.0.1:3000/login.html?name=lnj&pwd=123456;
let fileName = req.url.split("?")[0];
let filePath = path.join(rootPath, fileName);
// 2.判断静态资源是否存在
let isExists = fs.existsSync(filePath);
if (!isExists) {
return;
}
// 3.获取静态资源的后缀名
let fileExt = path.extname(filePath);
// 4.根据文件的后缀获取对应的类型
let type = mime[fileExt];
// 5.对文本类型进行特殊处理
if (type.startsWith("text")) {
type += "; charset=utf-8;";
}
// 6.告诉客户端返回数据的类型
res.writeHead(200, {
"Content-Type": type,
});
// 7.加载静态资源并返回静态资源
fs.readFile(filePath, (err, content) => {
if (err) {
res.end("Server Error");
return;
}
res.end(content);
});
}
module.exports = {
readFile,
};
文件后缀 json 文件:mime.json
json
{
".323": "text/h323",
".3gp": "video/3gpp",
".aab": "application/x-authoware-bin",
".aam": "application/x-authoware-map",
".aas": "application/x-authoware-seg",
".acx": "application/internet-property-stream",
".ai": "application/postscript",
".aif": "audio/x-aiff",
".aifc": "audio/x-aiff",
".aiff": "audio/x-aiff",
".als": "audio/X-Alpha5",
".amc": "application/x-mpeg",
".ani": "application/octet-stream",
".apk": "application/vnd.android.package-archive",
".asc": "text/plain",
".asd": "application/astound",
".asf": "video/x-ms-asf",
".asn": "application/astound",
".asp": "application/x-asap",
".asr": "video/x-ms-asf",
".asx": "video/x-ms-asf",
".au": "audio/basic",
".avb": "application/octet-stream",
".avi": "video/x-msvideo",
".awb": "audio/amr-wb",
".axs": "application/olescript",
".bas": "text/plain",
".bcpio": "application/x-bcpio",
".bin ": "application/octet-stream",
".bld": "application/bld",
".bld2": "application/bld2",
".bmp": "image/bmp",
".bpk": "application/octet-stream",
".bz2": "application/x-bzip2",
".c": "text/plain",
".cal": "image/x-cals",
".cat": "application/vnd.ms-pkiseccat",
".ccn": "application/x-cnc",
".cco": "application/x-cocoa",
".cdf": "application/x-cdf",
".cer": "application/x-x509-ca-cert",
".cgi": "magnus-internal/cgi",
".chat": "application/x-chat",
".class": "application/octet-stream",
".clp": "application/x-msclip",
".cmx": "image/x-cmx",
".co": "application/x-cult3d-object",
".cod": "image/cis-cod",
".conf": "text/plain",
".cpio": "application/x-cpio",
".cpp": "text/plain",
".cpt": "application/mac-compactpro",
".crd": "application/x-mscardfile",
".crl": "application/pkix-crl",
".crt": "application/x-x509-ca-cert",
".csh": "application/x-csh",
".csm": "chemical/x-csml",
".csml": "chemical/x-csml",
".css": "text/css",
".cur": "application/octet-stream",
".dcm": "x-lml/x-evm",
".dcr": "application/x-director",
".dcx": "image/x-dcx",
".der": "application/x-x509-ca-cert",
".dhtml": "text/html",
".dir": "application/x-director",
".dll": "application/x-msdownload",
".dmg": "application/octet-stream",
".dms": "application/octet-stream",
".doc": "application/msword",
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".dot": "application/msword",
".dvi": "application/x-dvi",
".dwf": "drawing/x-dwf",
".dwg": "application/x-autocad",
".dxf": "application/x-autocad",
".dxr": "application/x-director",
".ebk": "application/x-expandedbook",
".emb": "chemical/x-embl-dl-nucleotide",
".embl": "chemical/x-embl-dl-nucleotide",
".eps": "application/postscript",
".epub": "application/epub+zip",
".eri": "image/x-eri",
".es": "audio/echospeech",
".esl": "audio/echospeech",
".etc": "application/x-earthtime",
".etx": "text/x-setext",
".evm": "x-lml/x-evm",
".evy": "application/envoy",
".exe": "application/octet-stream",
".fh4": "image/x-freehand",
".fh5": "image/x-freehand",
".fhc": "image/x-freehand",
".fif": "application/fractals",
".flr": "x-world/x-vrml",
".flv": "flv-application/octet-stream",
".fm": "application/x-maker",
".fpx": "image/x-fpx",
".fvi": "video/isivideo",
".gau": "chemical/x-gaussian-input",
".gca": "application/x-gca-compressed",
".gdb": "x-lml/x-gdb",
".gif": "image/gif",
".gps": "application/x-gps",
".gtar": "application/x-gtar",
".gz": "application/x-gzip",
".h": "text/plain",
".hdf": "application/x-hdf",
".hdm": "text/x-hdml",
".hdml": "text/x-hdml",
".hlp": "application/winhlp",
".hqx": "application/mac-binhex40",
".hta": "application/hta",
".htc": "text/x-component",
".htm": "text/html",
".html": "text/html",
".hts": "text/html",
".htt": "text/webviewhtml",
".ice": "x-conference/x-cooltalk",
".ico": "image/x-icon",
".ief": "image/ief",
".ifm": "image/gif",
".ifs": "image/ifs",
".iii": "application/x-iphone",
".imy": "audio/melody",
".ins": "application/x-internet-signup",
".ips": "application/x-ipscript",
".ipx": "application/x-ipix",
".isp": "application/x-internet-signup",
".it": "audio/x-mod",
".itz": "audio/x-mod",
".ivr": "i-world/i-vrml",
".j2k": "image/j2k",
".jad": "text/vnd.sun.j2me.app-descriptor",
".jam": "application/x-jam",
".jar": "application/java-archive",
".java": "text/plain",
".jfif": "image/pipeg",
".jnlp": "application/x-java-jnlp-file",
".jpe": "image/jpeg",
".jpeg": "image/jpeg",
".jpg": "image/jpeg",
".jpz": "image/jpeg",
".js": "application/x-javascript",
".jwc": "application/jwc",
".kjx": "application/x-kjx",
".lak": "x-lml/x-lak",
".latex": "application/x-latex",
".lcc": "application/fastman",
".lcl": "application/x-digitalloca",
".lcr": "application/x-digitalloca",
".lgh": "application/lgh",
".lha": "application/octet-stream",
".lml": "x-lml/x-lml",
".lmlpack": "x-lml/x-lmlpack",
".log": "text/plain",
".lsf": "video/x-la-asf",
".lsx": "video/x-la-asf",
".lzh": "application/octet-stream",
".m13": "application/x-msmediaview",
".m14": "application/x-msmediaview",
".m15": "audio/x-mod",
".m3u": "audio/x-mpegurl",
".m3url": "audio/x-mpegurl",
".m4a": "audio/mp4a-latm",
".m4b": "audio/mp4a-latm",
".m4p": "audio/mp4a-latm",
".m4u": "video/vnd.mpegurl",
".m4v": "video/x-m4v",
".ma1": "audio/ma1",
".ma2": "audio/ma2",
".ma3": "audio/ma3",
".ma5": "audio/ma5",
".man": "application/x-troff-man",
".map": "magnus-internal/imagemap",
".mbd": "application/mbedlet",
".mct": "application/x-mascot",
".mdb": "application/x-msaccess",
".mdz": "audio/x-mod",
".me": "application/x-troff-me",
".mel": "text/x-vmel",
".mht": "message/rfc822",
".mhtml": "message/rfc822",
".mi": "application/x-mif",
".mid": "audio/mid",
".midi": "audio/midi",
".mif": "application/x-mif",
".mil": "image/x-cals",
".mio": "audio/x-mio",
".mmf": "application/x-skt-lbs",
".mng": "video/x-mng",
".mny": "application/x-msmoney",
".moc": "application/x-mocha",
".mocha": "application/x-mocha",
".mod": "audio/x-mod",
".mof": "application/x-yumekara",
".mol": "chemical/x-mdl-molfile",
".mop": "chemical/x-mopac-input",
".mov": "video/quicktime",
".movie": "video/x-sgi-movie",
".mp2": "video/mpeg",
".mp3": "audio/mpeg",
".mp4": "video/mp4",
".mpa": "video/mpeg",
".mpc": "application/vnd.mpohun.certificate",
".mpe": "video/mpeg",
".mpeg": "video/mpeg",
".mpg": "video/mpeg",
".mpg4": "video/mp4",
".mpga": "audio/mpeg",
".mpn": "application/vnd.mophun.application",
".mpp": "application/vnd.ms-project",
".mps": "application/x-mapserver",
".mpv2": "video/mpeg",
".mrl": "text/x-mrml",
".mrm": "application/x-mrm",
".ms": "application/x-troff-ms",
".msg": "application/vnd.ms-outlook",
".mts": "application/metastream",
".mtx": "application/metastream",
".mtz": "application/metastream",
".mvb": "application/x-msmediaview",
".mzv": "application/metastream",
".nar": "application/zip",
".nbmp": "image/nbmp",
".nc": "application/x-netcdf",
".ndb": "x-lml/x-ndb",
".ndwn": "application/ndwn",
".nif": "application/x-nif",
".nmz": "application/x-scream",
".nokia-op-logo": "image/vnd.nok-oplogo-color",
".npx": "application/x-netfpx",
".nsnd": "audio/nsnd",
".nva": "application/x-neva1",
".nws": "message/rfc822",
".oda": "application/oda",
".ogg": "audio/ogg",
".oom": "application/x-AtlasMate-Plugin",
".p10": "application/pkcs10",
".p12": "application/x-pkcs12",
".p7b": "application/x-pkcs7-certificates",
".p7c": "application/x-pkcs7-mime",
".p7m": "application/x-pkcs7-mime",
".p7r": "application/x-pkcs7-certreqresp",
".p7s": "application/x-pkcs7-signature",
".pac": "audio/x-pac",
".pae": "audio/x-epac",
".pan": "application/x-pan",
".pbm": "image/x-portable-bitmap",
".pcx": "image/x-pcx",
".pda": "image/x-pda",
".pdb": "chemical/x-pdb",
".pdf": "application/pdf",
".pfr": "application/font-tdpfr",
".pfx": "application/x-pkcs12",
".pgm": "image/x-portable-graymap",
".pict": "image/x-pict",
".pko": "application/ynd.ms-pkipko",
".pm": "application/x-perl",
".pma": "application/x-perfmon",
".pmc": "application/x-perfmon",
".pmd": "application/x-pmd",
".pml": "application/x-perfmon",
".pmr": "application/x-perfmon",
".pmw": "application/x-perfmon",
".png": "image/png",
".pnm": "image/x-portable-anymap",
".pnz": "image/png",
".pot,": "application/vnd.ms-powerpoint",
".ppm": "image/x-portable-pixmap",
".pps": "application/vnd.ms-powerpoint",
".ppt": "application/vnd.ms-powerpoint",
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
".pqf": "application/x-cprplayer",
".pqi": "application/cprplayer",
".prc": "application/x-prc",
".prf": "application/pics-rules",
".prop": "text/plain",
".proxy": "application/x-ns-proxy-autoconfig",
".ps": "application/postscript",
".ptlk": "application/listenup",
".pub": "application/x-mspublisher",
".pvx": "video/x-pv-pvx",
".qcp": "audio/vnd.qcelp",
".qt": "video/quicktime",
".qti": "image/x-quicktime",
".qtif": "image/x-quicktime",
".r3t": "text/vnd.rn-realtext3d",
".ra": "audio/x-pn-realaudio",
".ram": "audio/x-pn-realaudio",
".rar": "application/octet-stream",
".ras": "image/x-cmu-raster",
".rc": "text/plain",
".rdf": "application/rdf+xml",
".rf": "image/vnd.rn-realflash",
".rgb": "image/x-rgb",
".rlf": "application/x-richlink",
".rm": "audio/x-pn-realaudio",
".rmf": "audio/x-rmf",
".rmi": "audio/mid",
".rmm": "audio/x-pn-realaudio",
".rmvb": "audio/x-pn-realaudio",
".rnx": "application/vnd.rn-realplayer",
".roff": "application/x-troff",
".rp": "image/vnd.rn-realpix",
".rpm": "audio/x-pn-realaudio-plugin",
".rt": "text/vnd.rn-realtext",
".rte": "x-lml/x-gps",
".rtf": "application/rtf",
".rtg": "application/metastream",
".rtx": "text/richtext",
".rv": "video/vnd.rn-realvideo",
".rwc": "application/x-rogerwilco",
".s3m": "audio/x-mod",
".s3z": "audio/x-mod",
".sca": "application/x-supercard",
".scd": "application/x-msschedule",
".sct": "text/scriptlet",
".sdf": "application/e-score",
".sea": "application/x-stuffit",
".setpay": "application/set-payment-initiation",
".setreg": "application/set-registration-initiation",
".sgm": "text/x-sgml",
".sgml": "text/x-sgml",
".sh": "application/x-sh",
".shar": "application/x-shar",
".shtml": "magnus-internal/parsed-html",
".shw": "application/presentations",
".si6": "image/si6",
".si7": "image/vnd.stiwap.sis",
".si9": "image/vnd.lgtwap.sis",
".sis": "application/vnd.symbian.install",
".sit": "application/x-stuffit",
".skd": "application/x-Koan",
".skm": "application/x-Koan",
".skp": "application/x-Koan",
".skt": "application/x-Koan",
".slc": "application/x-salsa",
".smd": "audio/x-smd",
".smi": "application/smil",
".smil": "application/smil",
".smp": "application/studiom",
".smz": "audio/x-smd",
".snd": "audio/basic",
".spc": "application/x-pkcs7-certificates",
".spl": "application/futuresplash",
".spr": "application/x-sprite",
".sprite": "application/x-sprite",
".sdp": "application/sdp",
".spt": "application/x-spt",
".src": "application/x-wais-source",
".sst": "application/vnd.ms-pkicertstore",
".stk": "application/hyperstudio",
".stl": "application/vnd.ms-pkistl",
".stm": "text/html",
".svg": "image/svg+xml",
".sv4cpio": "application/x-sv4cpio",
".sv4crc": "application/x-sv4crc",
".svf": "image/vnd",
".svg": "image/svg+xml",
".svh": "image/svh",
".svr": "x-world/x-svr",
".swf": "application/x-shockwave-flash",
".swfl": "application/x-shockwave-flash",
".t": "application/x-troff",
".tad": "application/octet-stream",
".talk": "text/x-speech",
".tar": "application/x-tar",
".taz": "application/x-tar",
".tbp": "application/x-timbuktu",
".tbt": "application/x-timbuktu",
".tcl": "application/x-tcl",
".tex": "application/x-tex",
".texi": "application/x-texinfo",
".texinfo": "application/x-texinfo",
".tgz": "application/x-compressed",
".thm": "application/vnd.eri.thm",
".tif": "image/tiff",
".tiff": "image/tiff",
".tki": "application/x-tkined",
".tkined": "application/x-tkined",
".toc": "application/toc",
".toy": "image/toy",
".tr": "application/x-troff",
".trk": "x-lml/x-gps",
".trm": "application/x-msterminal",
".tsi": "audio/tsplayer",
".tsp": "application/dsptype",
".tsv": "text/tab-separated-values",
".ttf": "application/octet-stream",
".ttz": "application/t-time",
".txt": "text/plain",
".uls": "text/iuls",
".ult": "audio/x-mod",
".ustar": "application/x-ustar",
".uu": "application/x-uuencode",
".uue": "application/x-uuencode",
".vcd": "application/x-cdlink",
".vcf": "text/x-vcard",
".vdo": "video/vdo",
".vib": "audio/vib",
".viv": "video/vivo",
".vivo": "video/vivo",
".vmd": "application/vocaltec-media-desc",
".vmf": "application/vocaltec-media-file",
".vmi": "application/x-dreamcast-vms-info",
".vms": "application/x-dreamcast-vms",
".vox": "audio/voxware",
".vqe": "audio/x-twinvq-plugin",
".vqf": "audio/x-twinvq",
".vql": "audio/x-twinvq",
".vre": "x-world/x-vream",
".vrml": "x-world/x-vrml",
".vrt": "x-world/x-vrt",
".vrw": "x-world/x-vream",
".vts": "workbook/formulaone",
".wav": "audio/x-wav",
".wax": "audio/x-ms-wax",
".wbmp": "image/vnd.wap.wbmp",
".wcm": "application/vnd.ms-works",
".wdb": "application/vnd.ms-works",
".web": "application/vnd.xara",
".wi": "image/wavelet",
".wis": "application/x-InstallShield",
".wks": "application/vnd.ms-works",
".wm": "video/x-ms-wm",
".wma": "audio/x-ms-wma",
".wmd": "application/x-ms-wmd",
".wmf": "application/x-msmetafile",
".wml": "text/vnd.wap.wml",
".wmlc": "application/vnd.wap.wmlc",
".wmls": "text/vnd.wap.wmlscript",
".wmlsc": "application/vnd.wap.wmlscriptc",
".wmlscript": "text/vnd.wap.wmlscript",
".wmv": "audio/x-ms-wmv",
".wmx": "video/x-ms-wmx",
".wmz": "application/x-ms-wmz",
".wpng": "image/x-up-wpng",
".wps": "application/vnd.ms-works",
".wpt": "x-lml/x-gps",
".wri": "application/x-mswrite",
".wrl": "x-world/x-vrml",
".wrz": "x-world/x-vrml",
".ws": "text/vnd.wap.wmlscript",
".wsc": "application/vnd.wap.wmlscriptc",
".wv": "video/wavelet",
".wvx": "video/x-ms-wvx",
".wxl": "application/x-wxl",
".x-gzip": "application/x-gzip",
".xaf": "x-world/x-vrml",
".xar": "application/vnd.xara",
".xbm": "image/x-xbitmap",
".xdm": "application/x-xdma",
".xdma": "application/x-xdma",
".xdw": "application/vnd.fujixerox.docuworks",
".xht": "application/xhtml+xml",
".xhtm": "application/xhtml+xml",
".xhtml": "application/xhtml+xml",
".xla": "application/vnd.ms-excel",
".xlc": "application/vnd.ms-excel",
".xll": "application/x-excel",
".xlm": "application/vnd.ms-excel",
".xls": "application/vnd.ms-excel",
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".xlt": "application/vnd.ms-excel",
".xlw": "application/vnd.ms-excel",
".xm": "audio/x-mod",
".xml": "text/plain",
".xml": "application/xml",
".xmz": "audio/x-mod",
".xof": "x-world/x-vrml",
".xpi": "application/x-xpinstall",
".xpm": "image/x-xpixmap",
".xsit": "text/xml",
".xsl": "text/xml",
".xul": "text/xul",
".xwd": "image/x-xwindowdump",
".xyz": "chemical/x-pdb",
".yz1": "application/x-yz1",
".z": "application/x-compress",
".zac": "application/x-zaurus-zac",
".zip": "application/zip",
".json": "application/json"
}
app.js 中,请求先判断是否静态资源:staticServer.readFile(req, res, rootPath),再设置其他请求响应数据处理
js
// 1.导入http模块
const http = require("http");
const queryString = require("querystring");
const path = require("path");
// 静态资源加载模块
const rootPath = path.join(__dirname, "www"); // www目录放置静态资源文件
const staticServer = require("./staticServer");
// 2.通过http模块创建服务对象
const server = http.createServer();
// 3.通过服务对象监听用户请求
server.on("request", (req, res) => {
// 是否读取的是静态资源
staticServer.readFile(req, res, rootPath);
// 1.获取请求类型
let method = req.method.toLowerCase();
// 2.获取请求路径
let url = req.url;
let path = url.split("?")[0];
// 3.获取请求参数
let params = "";
if (method === "get") {
// 4.处理请求参数
params = url.split("?")[1];
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
// console.log('处理登录请求', params);
// 1.告诉客户端返回的数据是什么类型
res.writeHead(200, {
// 'Content-Type': 'text/plain; charset=utf-8;'
"Content-Type": "application/json;",
});
// 2.告诉客户端返回的数据是什么
// res.end('呵呵哈哈哈');
res.end(JSON.stringify({ name: "lnj", age: 33 }));
} else if (path === "/register") {
console.log("处理注册请求", params);
}
} else if (method === "post") {
// 4.处理请求参数
req.on("data", (chuck) => {
params += chuck;
});
req.on("end", () => {
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
console.log("post处理登录请求", params);
} else if (path === "/register") {
console.log("post处理注册请求", params);
}
});
}
});
// 4.指定监听的端口号
server.listen(3000);
使用模板引擎:ejs
ejs 的 npm 文档:ejs - npm (npmjs.com)
加载 ejs 模板引擎,文件:dynamicServer.js
js
const ejs = require("ejs");
function renderHTML(req, res, fileName) {
ejs.renderFile(fileName, req.data, function (err, str) {
res.writeHead(200, {
"Content-Type": "text/html; charset=utf-8;",
});
res.end(str);
});
}
module.exports = {
renderHTML,
};
app.js 写入
js
// 1.导入http模块
const http = require("http");
const queryString = require("querystring");
const dynamicServer = require("./dynamicServer");
// 2.通过http模块创建服务对象
const server = http.createServer();
// 3.通过服务对象监听用户请求
server.on("request", (req, res) => {
// 1.获取请求类型
let method = req.method.toLowerCase();
// 2.获取请求路径
let url = req.url;
let path = url.split("?")[0];
// 3.获取请求参数
let params = "";
if (method === "get") {
// 4.处理请求参数
params = url.split("?")[1];
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
// console.log('处理登录请求', params);
let data = { msg: "我是动态数据" };
req.data = data;
// 加载html文件
dynamicServer.renderHTML(req, res, "./views/index.html");
} else if (path === "/register") {
console.log("处理注册请求", params);
}
} else if (method === "post") {
// 4.处理请求参数
req.on("data", (chuck) => {
params += chuck;
});
req.on("end", () => {
params = queryString.parse(params);
// 5.处理路由
if (path === "/login") {
console.log("post处理登录请求", params);
} else if (path === "/register") {
console.log("post处理注册请求", params);
}
});
}
});
// 4.指定监听的端口号
server.listen(3000);
使用 ejs 模板编写 html:views\index.html
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>动态网页</title>
</head>
<body>
<h1>我是动态网页</h1>
<h2><%=msg%></h2>
</body>
</html>