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()--获取当前用户