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 中你将需要使用 useTracker
或 withTracker
。无论哪种方式,你所进行的测试 运行 仍然有助于加深对 Meteor 的理解。
如果您想了解更多信息,请在浏览器中打开开发人员控制台,转到网络,然后查看 WS(网络套接字)上的消息。您将学到很多有关 DDP 工作原理的知识,这是 Meteor 用于在服务器和客户端之间同步数据的协议。即使只了解 DDP 的基础知识,也能真正帮助您构建更好的 Meteor 应用程序,并对它更有信心。
当客户端代码中 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 中你将需要使用 useTracker
或 withTracker
。无论哪种方式,你所进行的测试 运行 仍然有助于加深对 Meteor 的理解。
如果您想了解更多信息,请在浏览器中打开开发人员控制台,转到网络,然后查看 WS(网络套接字)上的消息。您将学到很多有关 DDP 工作原理的知识,这是 Meteor 用于在服务器和客户端之间同步数据的协议。即使只了解 DDP 的基础知识,也能真正帮助您构建更好的 Meteor 应用程序,并对它更有信心。