最近出了一直在做无聊的管理后台,还抽空做了我公司的计费终端,前端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 ,重新起一边文章吧,写在这里好像不太合适了。