美文网首页
node日志框架、环境变量和路由控制

node日志框架、环境变量和路由控制

作者: 雨落倾城夏微凉_e861 | 来源:发表于2020-07-26 19:35 被阅读0次

    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

    4.png
    由于浏览器只能测试get方法所以post就不进行测试了,如上图展示说明成功了。

    相关文章

      网友评论

          本文标题:node日志框架、环境变量和路由控制

          本文链接:https://www.haomeiwen.com/subject/gxxglktx.html