本篇博客记录了《Node.js 从零开发web server博客项目》的原生开发系列内容。
开篇主要介绍原生项目的搭建,以及初步的项目结构设计。
一、项目初始化
新建项目目录,并进入到项目目录中,使用命令npm init初始化项目,期间会让你配置项目名称,版本,作者等信息。结束之后生成package.json文件。
{
"name": "blog-1",
"version": "1.0.0",
"description": "",
"main": "bin/www.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www"
},
"author": "",
"license": "ISC",
"dependencies": {
"cross-env": "^7.0.2",
"nodemon": "^2.0.3"
}
}
其中main表示的是项目的入口文件,我们改成了bin/www.js,需要建立相应的文件夹与入口文件。
scripts是可执行的命令,包括编译执行、测试等命令的编写。
dependencies主要管理一些依赖的npm包等内容。
二、根据功能模块划分文件夹
入口文件为bin/www.js,主要负责项目的启动,创建http server端的监听以及请求分发、返回结果等。
src为源码,主要按照功能模块划分文件夹,我们根据接口进行划分,一开始不关注功能的具体实现,我们根据接口划分不同的路由文件。
目前为止,我们的目录结构如下:
三、入口文件、请求处理与返回及路由文件的编写
首先是入口文件www.js的编写。其主要职责是创建http server,并且监听指定的端口。
const http = require('http');
const serverHandler = require('../app');
const server = http.createServer(serverHandler);
const port = 8000;
server.listen(port);
整体代码相对简单,职责单一,对请求的处理和返回则放在了app.js中。
const userRouterHandler = require('./src/router/user.router');
const blogRouterHandler = require('./src/router/blog.router');
const serverHandler = (req, res) => {
res.setHeader('Content-type','application/json');
const userLogin = userRouterHandler(req, res);
if(userLogin){
res.end(JSON.stringify(userLogin));
return;
}
const blogData = blogRouterHandler(req, res);
if(blogData){
res.end(JSON.stringify(blogData));
return;
}
res.writeHead(404, {"Content-type":"text/plain"});
res.write("404 Not Found");
res.end();
}
module.exports = serverHandler;
app.js中主要是处理请求和内容返回,其中res.setHeader('Content-type','application/json');设置了返回内容是JSON格式,注意虽然返回的内容是json格式,但还是需要把返回的json转成json字符串再返回。
路由文件将具体处理每个接口,并返回结果。
const userRouterHandler = (req,res) => {
const method = req.method;
const url = req.url;
const path = url.split('?')[1];
if(method==="POST" && path === "/api/user/login"){
return {
msg: "登录接口"
}
}
}
module.exports = userRouterHandler;
以用户登录的接口为例,用户模块的路由需要判断请求的方法,以及path,请求的路径,即接口路径。然后根据路径匹配,处理不同的逻辑,并返回结果。
四、开发中实用的依赖
本项目中,截止目前为止使用了cross-env依赖,使用该依赖,我们可以设置环境变量,如开发环境设置如下
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www"
该执行脚本设置了node环境变量为dev。使用时执行如下脚本:
process.env.NODE_ENV获取。
第二个使用的依赖是nodemon,引入这个依赖在我们开发过程中帮助很大,能监控文件是否发生变化,一旦发生变化将会自动编译。
使用如下
nodemon ./bin/www。
到目前为止,我们的代码已经能够处理不同的接口,并返回响应的内容。