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 ,重新起一边文章吧,写在这里好像不太合适了。

    他山之石,可以攻玉
  • 相关阅读:
    RabbitMq学习4-发布/订阅(Publish/Subscribe)
    RabbitMq学习3-工作队列(Work queues)
    《大型网站技术架构》-读书笔记七:安全架构
    RabbitMq学习2-php命令行模式测试rabbitmq
    《大型网站技术架构》-读书笔记六:可扩展架构
    RabbitMq学习1-介绍、安装和配置
    《大型网站技术架构》-读书笔记五:伸缩性架构
    C#构建树形数据结构
    数据结构和算法(一)概念
    C# 简介
  • 原文地址:https://www.cnblogs.com/webDojo/p/9398817.html
Copyright © 2011-2022 走看看