node是前端非常火的一门后端语言,前面介绍了跨域和模块导入导出。今天同样基于模块导入导出的代码添加新的功能。首先看看node中的一个体制框架吧。
winston
在根目录下新建一个logger的文件夹,在此文件夹下面添加logger.js文件
1.png
安装框架
cnpm i -S winston 或
npm i -S winston 或
yarn i -S winston
安装成功后在logger.js中使用
logger.js
import winston, {format} from "winston"
const myFormat = format.printf(log => {
return `${log.timestamp} ${log.level}: ${log.message}`
})
const logger = winston.createLogger({
level: 'info',//输出级别
format: format.combine(format.timestamp(),myFormat),//输出格式format.json(),format.simple()等也可自定义,timestamp:日志输出时间
transports: [
new winston.transports.Console(),//是否在控制台输出
new winston.transports.File({ filename: './log/error.log', level: 'error' }),//将日志输出到根目录下的log/error.log,输出级别是error,不指定的话采用全局配置的
new winston.transports.File({ filename: './log/warn.log', level: 'warn' }),//将日志输出到根目录下的log/error.log,输出级别是error,不指定的话采用全局配置的
new winston.transports.File({ filename: './log/combined.log' }),////将日志输出到根目录下的log/error.log,输出级别使用全局配置的info
],
});
export default logger
官方提供的级别:
const levels = {
error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
};
输出的规则我测试得到的结果是如果指定了一个输出级别,在输出的时候会把小于等于他的级别一块输出。例如指定的级别是info,那么输出时会把warn和error一起输出到指定文件。
此时我们在根目录下再创建一个log的空文件夹。
在server/index.js下引入
import express from "express"
import myexpress from "./express"
import logger from "../logger/logger"
logger.info("info message")
logger.warn("warn message")
logger.error("error messgae")
const server = myexpress (express);
server.listenAsync(3000).then(()=>console.log("http://localhost:3000" ));
在index.js中添加不同级别的日志输出。
环境变量
下载依赖:
cnpm i -S cross-env或
npm i -S cross-env或
yarn i -S cross-env
cross-env可以帮助我们在启动命令中添加node全局变量,并且是windows,mac,linux通用的。修改package.json文件
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start:dev": "cross-env NODE_ENV=development PORT=3001 babel-node server/index.js",
"start:pro": "cross-env NODE_ENV=production PORT=3002 babel-node server/index.js"
},
设置了两个全局变量NODE_ENV和PORT(设置不同端口)
再修改server/index.js如下
import express from "express"
import myexpress from "./express"
import logger from "../logger/logger"
logger.info("info message")
logger.warn("warn message")
logger.error("error messgae")
const server = myexpress (express);
const port = process.env.PORT || 3000
server.listenAsync(port).then(()=>console.log("http://localhost:" + port));
做完这些操作接下来测测环境变量和日志文件有没有问题,控制台输入:
npm run start:dev
2.png
看到控制台输出的日志和配置的端口。然后查看log目录发现自动生成了三个日志文件
3.png
combined.log
2020-07-26T09:56:25.955Z info: info message
2020-07-26T09:56:25.959Z warn: warn message
2020-07-26T09:56:25.959Z error: error messgae
error.log
2020-07-26T09:56:25.959Z error: error messgae
warn.log
2020-07-26T09:56:25.959Z warn: warn message
2020-07-26T09:56:25.959Z error: error messgae
combined.log文件输出了三行日志,没有给combined.log设置级别,他默认使用全局配置的info,info在刚才的级别表中的索引是2,因为会输出小于等于自身级别的所有日志,所以warn和error都在combined.log文件输出了,同理error.log只输出了error,warn,log文件输出了warn和error。
路由控制器(express中自带的Router)
根目录下创建router文件夹,文件夹下面添加两个文件一个index.js另一个是constructor.js
constructor.js中添加控制器方法
随意定义了两个事例登录和列表
const constructor = {
login(req, res){
if(req.body.uname && req.body.pwd){
res.send({code: 200, msg: "login success"})
return
}
res.send({code: 400, msg: "login failed"})
},
list(req, res){
let list = [
{name: "a", age:10},
{name: "b", age:11},
{name: "c", age:12},
]
res.status(200).json(list)
}
}
export default constructor
index.js
定义了两个路由,并为他们添加控制器方法
import ctro from "./constructor"//引入控制器方法
export default (express, app) => {
const router = express.Router();
router.route("/login").post(ctro.login);
router.route("/list").get(ctro.list);
app.use("/api",router);
}
在express.js中调用路由文件
import bodyParser from "body-parser"
import util from "util"
export default (express) => {
const app = express();
var allowCrossDomain = function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');//自定义中间件,设置跨域需要的响应头。
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE'); //允许任何方法
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,X-Session-Token'); //允许任何类型
next();
};
app.use(allowCrossDomain);
app.use(bodyParser.json());//解析json
app.use(bodyParser.urlencoded({extended:true}))//解析表单
app.get("/",(req, res) => {
res.send("这是首页");
})
//引入路由,两种引入方式
require("../router/index.js")(express, app);
//require(`${process.cwd()}/router/index.js`)(express, app);
app.listenAsync = util.promisify(app.listen);
return app;
}
在终端执行
npm run start:dev
在浏览器输入http://localhost:3001/api/list
由于浏览器只能测试get方法所以post就不进行测试了,如上图展示说明成功了。
网友评论