美文网首页
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日志框架、环境变量和路由控制

    node是前端非常火的一门后端语言,前面介绍了跨域和模块导入导出。今天同样基于模块导入导出的代码添加新的功能。首先...

  • [Bash] Prefix Shell Parameters

    1. Background 当使用某个框架进行node开发时,控制台上可能会输出一堆系统日志,这些日志中,大多数是...

  • fastapi路由管理

    fastapi路由管理,和GIN的框架思想一致。入口函数----主路由---控制器---服务 main入口函数,需...

  • 小程序路由

    框架以栈的方式控制页面的路由。

  • Express-node项目流

    Express,高度包容、快速而极简的 Node.js Web 框架 主要有: 路由 (请求网站任何东西,都是路由...

  • 组件化2.路由框架的设计

    路由框架原理 路由框架是为了实现组件之间的通信 路由框架维护了一个分组的路由表路由表中存放了路由地址和路由信息路由...

  • 【Fizzday03】构建MVC之控制器Controller

    控制器 顾名思义, 就是作为框架的业务控制而存在, 其实, 我们在路由部分, 为了测试路由的可用性, 已经建立控制...

  • Routers - Django REST framework

    路由器-Django REST框架 routers.py 路由器 资源路由允许您快速声明给定的足智多谋控制器的所有...

  • express

    基于Node.js平台,快速、开放、极简的 web 开发框架。 1.路由 router.get('/',handl...

  • Node.js基础知识(转载)

    深入学习Node之前,需要先知道Node这个框架的基本知识。 控制台 console对象:Node中使用该对象表示...

网友评论

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

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