zoukankan      html  css  js  c++  java
  • node 写api几个简单的问题

    最近出了一直在做无聊的管理后台,还抽空做了我公司的计费终端,前端vue,后端node,代码层面没啥太多的东西。由于自己node版本是8.0.0,node自身是不支持import和export的,要想基于它们实现模块加载,一种方式就是利用babel,另一种方式使用ts.当然可能还有别的方式,我暂时就想到这两种。不过时间比较紧,我ts的水平还没过实践。为了保险,还是直接配置babel 

    {
      "presets": ["stage-3"],
      "plugins": [
          "transform-async-to-generator",
          "transform-es2015-modules-commonjs",
          "transform-export-extensions",
          "babel-plugin-transform-es2015-classes"
      ]
    }

    .babelrc 文件如上。在对应下载 这几个依赖,在app.js 入口  require('babel-core/register'); 就可以愉快的使用import和export

    因为基础的代码是采用es6的class,我总结的几个关键点其实也没几个,说几个个人认为比较重要的:

    1:基于symbol实现的私有方法,不解释了。

    const getDevId = Symbol('DevId');
    class () {
          async [getDevId] (carPlate) {
            try {
                let resCarVin = await carVinModel({ carPlate });
                let resDevId = await devIdModel({ resCarVin: resCarVin[0].car_vin });
                this.devId = resDevId[0].dev_id
            } catch (error) {
                throw new Error(error);
            }
        }
    }

    2: 上下文的绑定

    虽然我们的controller都是基于class,但事实上我们export 的是这个class 的实例,路由部分引入的是这个实例的某个方法,但是问题就是在这个地方,如果引入实例的方法,还存在实例属性或者其他的实例方法,这个时候如果不绑定上下文,会发生错误

    具体代码如下

    class {
    async carGPS (req, res, next) {
            let { carPlate, starttime, endtime } = req.query;
            try {
                if (!this.devId) {
                    await this[getDevId](carPlate);
                }
                let response = await carGPSModel({ resDevId: this.devId, starttime, endtime });
            } catch (error) {
                console.log(error);
                });
            }
        }
    }

    代码大体就这样,如果在别的文件通过类的实例调用这个方法,如果不绑定这个方法的上下文可能会出错的   解决方法其实很简单,如果写react的话可能对这种方式很清楚,就是在class 的contructor中this.carGps = this.carGps.bind(this)

    3.万年的跨域问题

    app.all('*', (req, res, next) => {
        res.header("Access-Control-Allow-Origin", req.headers.Origin || req.headers.origin);
        res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
        res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
          res.header("Access-Control-Allow-Credentials", true); //可以带cookies
        if (req.method == 'OPTIONS') {
              res.sendStatus(200);
        } else {
            next();
        }
    });

    大概就这么几个简单问题,其他就是业务问题,不过发现自己的sql好差呀!!! 其实自己做的这个东西最大的收获不是代码层面的,而是关于部署层面的。docker哈 pm2啊 nginx的proxy_pass啦 gzip ,重新起一边文章吧,写在这里好像不太合适了。

    他山之石,可以攻玉
  • 相关阅读:
    Laravel 初始化
    ant design pro 左上角 logo 修改
    请求到服务端后是怎么处理的
    Websocket 知识点
    王道数据结构 (7) KMP 算法
    王道数据结构 (6) 简单的模式匹配算法
    王道数据结构 (4) 单链表 删除节点
    王道数据结构 (3) 单链表 插入节点
    王道数据结构 (2) 单链表 尾插法
    王道数据结构 (1) 单链表 头插法
  • 原文地址:https://www.cnblogs.com/webDojo/p/9398817.html
Copyright © 2011-2022 走看看