我试图理解为什么在调用流星服务器方法时出现错误。它在服务器端工作,但它在浏览器中抛出错误。
这是 /server/methods.js 文件中的服务器代码:
Meteor.methods({
getTicketSettings: function(){
var getTicketConfig = function(callback){
Assets.getText('ticketCustomizing.json', function(error, res){
if (error)
throw new Meteor.Error({error:'ticket-getCustomizing', reason:'No se pudo recuperar la configuración.'});
else callback && callback(null, JSON.parse(res));
});
}
var syncAssetRetrieve = Meteor.wrapAsync(getTicketConfig);
var result = syncAssetRetrieve();
return result;
},
});
这是我在 /lib/initialization.js 文件中的客户端/服务器代码:
App.config.tickets.tipos = new Mongo.Collection('tipos');
Meteor.startup(function(){
moment.locale('es');
var ticketSettingsObj = Meteor.call('getTicketSettings');
console.log(ticketSettingsObj);
_.map(ticketSettingsObj.tipos, function(tipo){
App.config.tickets.tipos.insert(tipo);
});
});
当我运行我的应用程序时,我在控制台中记录了JSON对象,但浏览器显示此错误:未捕获TypeError:无法在 / lib中读取未定义的属性“tipos” /initialization.js 这里:
_.map(ticketSettingsObj.tipos, function(tipo){
App.config.tickets.tipos.insert(tipo);
});
显然我误解了一些东西,但仍然在想......
答案 0 :(得分:2)
您需要将回调传递给Meteor.call。服务器可以同步运行它,阻塞直到它返回,但客户端不能这样,所以ticketSettingsObj将始终未定义。
请参阅Meteor docs
没有错误处理(和未经测试):
Meteor.call('getTicketSettings', function(error, result){
console.log(result);
_.map(result.tipos, function(tipo){
App.config.tickets.tipos.insert(tipo);
});
});
答案 1 :(得分:1)
执行package expo;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Expo extends JPanel implements KeyListener{
int x = 0;
int y = 0;
@Override
public void keyTyped(KeyEvent e) {
//System.out.println("Key Typed");
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Key Pressed" + e.getKeyCode());
y = y + 2;
}
}
@Override
public void keyReleased(KeyEvent e) {
//System.out.println("Key Released");
}
public void paint(Graphics g){
g.setColor(Color.BLUE);
g.drawRect(x ,y,100,100);
repaint();
}
public static void main(String[] args) throws InterruptedException {
Expo expo = new Expo();
JFrame f = new JFrame();
f.setVisible(true);
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.addKeyListener(expo);
f.add(expo);
f.repaint();
}
}
并查看它是否返回有效对象。如果它没有,那么您只在服务器端定义了对象console.log(App.config.tickets)
。如果这是故意的,并且您只希望在服务器端访问它,那么添加App.config.tickets
或将其定义移动到if(Meteor.isServer)
目录中的文件。