meteor方法

1.Account

  login(phoneNumber: string, code: string): Promise<void> {
    return new Promise<void>((resolve, reject) => {
      Accounts.verifyPhone(phoneNumber, code, (e: Error) => {
        if (e) {
          return reject(e);
        }

        resolve();
      });
    });
  }

 

2.发布和订阅

1.在server端发布

 Meteor.publish('time', function() {
     ...
    });

2.在client端订阅

后面可以带参数或者控制器函数

Meteor.subscribe('time', id)
Meteor.subscribe('time', {
          onReady: function() {
            console.log('the server called this.ready()')
         },
         onError: function() {
           console.log('error on the server')
         }
});

客户端也要创建新的mongo实例,然后通过订阅后的服务器的数据会推送到该实例上,但是只存在于内存中,所有对数据库的操作必须通过服务器的mongo实例进行操作!

3.配合react事件函数取消订阅

componentWillUnmount() {
    this.props.handle.stop();
  }

export default createContainer(() => {
  return {
    time: Time.find().fetch(),
    handle: handle
      };
     }, Timer)
const handle = Meteor.subscribe('time', {          
     onReady: function() {
            console.log('the server called this.ready()')
         },
         onError: function() {
           console.log('error on the server')
         }});
handle.stop() // will call onStop(callback) on the server.
handle.ready() // returns true if the server called ready()

4.在服务器端写就绪和取消订阅的处理

利用this.ready() this.stop() this.onStop()

Meteor.publish('time', function() {
   let self = this;
   self.added('time', id, time); // notify if record is added to the collection time
  this.ready(); // notify that the initial dataset was sent

   self.onStop(function () {
   self.stop()
   console.log('stopped called')
   Meteor.clearInterval(interval); // clear the interval if the the client unsubscribed
  });
});

3.延迟函数

 Meteor.setInterval(function() {
        newTime();
     }, 1000);

 Meteor.clearInterval(interval);

4.数据库操作

默认可以直接在客户端对数据库进行操作,删除secure包后,只能调用服务器的方法对数据进行操作,而如果直接在客户端调用collection.insert()之类的方法,最终的结果只会存储在客户端的minimogo中

1.定义方法

import { Meteor } from 'meteor/meteor';

Meteor.methods({
cartInsert: function(product) {
      CartCollection.insert({
       'title' : product.title,
       'price' : product.price,
       'inventory' : product.inventory,
       'quantity': 1
 });

2.然后在客户端使用

import { Meteor } from 'meteor/meteor';

export const addToCart = (product) => {
   Meteor.call('cartInsert', product);
};

对于返回数值的可采用promise

   cartTotal: function() {
    let total = CartCollection.aggregate([
        { $project: {"priceByquantity":{ $multiply: [ "$price", "$quantity" ] } }},
        { $group: { "_id": "null", "totalPrice": { $sum: "$priceByquantity" } } }
        ]);
     return total;
 }

用aggregate计算总价钱,$project来产生一个"priceByquantity"的新键, "_id": "null"表示把所有的加起来,"totalPrice"为赋值的对象,最终得到的值包裹在data中

export const getCartTotal = () => {
  return new Promise((resolve, reject) => {
 Meteor.call('cartTotal', (error, data) => {
       if (error) {
          reject(error)
      }
     if(!data[0]){
        resolve(0)
     }
      resolve(data[0].totalPrice)
    })
 });
};

使用promise来包裹,利用then还有catch来对其中的数据进行操作

 getCartTotal().then(result => {
      self.setState({
        totalPrice: result
      })
    }).catch(error => {
      alert('error')
    });

由于promise是异步的,而container本身是异步的,其内部只能使用同步的方法,所以把getCartTotal()放在组件事件周期中使用

 componentDidMount() 
 componentWillReceiveProps()

只有初始化和props改变的时候

5.验证和模型

import { check } from 'meteor/check';
check('title' : product.title,string)
check( product, CartCollection.simpleSchema())

不常用!!

 meteor add aldeed:simple-schema
let CartSchema = new SimpleSchema({
  _id: {
    type: String,
    optional: false
  },
  price: {
    type: Number,
    decimal: true   设为false则为整数
  },
  quantity: {
    type: Number,
    defaultValue: 1,
    optional: true
  },
  department: {
    type: String,
    optional: false
  }
});

department是必须的,验证完模型后再insert

直接使用collection2会自动每次校正格式(meteor add aldeed:collection2)

CartCollection.attachSchema(CartSchema)
check( product, CartCollection.simpleSchema());
//弃用
CartCollection.schema.validate(product);
CartCollection.schema.clean(product);
check( product, CartCollection.schema);
//在每次插入前去掉product里面不必要的部分,使其规范化
CartCollection.insert({....})

6.用户登录

meteor add accounts-password
allanning:roles
Accounts.creatUser({email:444,password:6665})
Meteor.loginWithPassword(email,password)
Meteor.logout(fuc(err){})
Meteor.users.findOne()
Meteor.user()--获取当前用户

转载于:https://my.oschina.net/yihong/blog/1530974

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值