Meteor 订阅集合 returns 零个文档

Meteor subscribe to collection returns zero documents

当客户端代码中 console.log 时,此 Meteor 代码无法 return Vehicles 集合中的文档数。请帮助找到我出错的问题。谢谢

//imports/api/vehicles.js
import {Mongo} from 'meteor/mongo';
export const Vehicles = new Mongo.Collection('vehicles');
///////////////////////////////////////////

//server/publish.js
import {Vehicles}   from '../imports/api/vehicles.js'

Meteor.publish('vehicles', function(){
    return Vehicles.find({})
})
///////////////////////////////////////////

//server/main.js
import { Vehicles } from '../imports/api/vehicles.js';

//so I added this tying to fix the problem for no avail
Meteor.startup(() => {
  Meteor.publish('vehicles', function () { 
    return Vehicles.find();
  });
});
///////////////////////////////////////////

//client/main.js
import {Vehicles} from '../imports/api/vehicles.js'
Meteor.startup(function(){
  Meteor.subscribe('vehicles');
  console.log('subscribed') //<<<<<< prints "subscribed"
  
  let rec = Vehicles.find({}).count()
  console.log(rec) //<<<<<< prints "0"
})
///////////////////////////////////////////

Blaze collection findOnereturn没有文档 阅读第一个回复后,关于 Blaze 会自动执行,我不必执行 Meteor.startup Meteor.subscribe.onReady... 请注意下面的 blaze 模板助手未定义。

//client/main.js
Tracker.autorun(() => {
  Meteor.subscribe('vehicles', {plate: Session.get('plate')});
});

Template.vehicle.helpers({
  'vehicle' : function(){
    let vehicle = Vehicles.findOne({'plate':Session.get('plate')})
    console.log(vehicle) //prints undefined
  }
})

Template.vehicle.events({ 
  'keyup #plate'(e, inst){
      let str = e.currentTarget.value
        Session.set('plate', str)
        console.log(str) // prints the value OK
  }
})

订阅不会立即准备就绪。您需要先等待数据到达客户端。请记住,客户端上的所有内容都是异步的,因为浏览器中没有纤程(与服务器上不同)。这就是 subscribe 函数具有 onReady 回调的原因,您可以指定:

Meteor.startup(function(){
  Meteor.subscribe('vehicles', {onReady: () => {
    console.log('subscription ready') 
    let rec = Vehicles.find({}).count()
    console.log(rec)
  }});

  console.log('subscribed') // << this will print first
})

实际上你不需要这个,因为你通常会在 UI 组件中使用集合中的数据,还有 UI 框架(例如 Blaze 或 React)一旦数据到达,将采取反应式重新渲染。在完全自动的 Blaze 中,在 React 中你将需要使用 useTrackerwithTracker。无论哪种方式,你所进行的测试 运行 仍然有助于加深对 Meteor 的理解。

如果您想了解更多信息,请在浏览器中打开开发人员控制台,转到网络,然后查看 WS(网络套接字)上的消息。您将学到很多有关 DDP 工作原理的知识,这是 Meteor 用于在服务器和客户端之间同步数据的协议。即使只了解 DDP 的基础知识,也能真正帮助您构建更好的 Meteor 应用程序,并对它更有信心。