2015-01-02 36 views
6

Trong Meteor tôi nhận được lỗi này cho mọi phương pháp tôi xác định trên các mặt hàng:Lỗi gọi phương pháp '': Phương pháp không tìm thấy [404]

Error invoking Method 'activeMenu': Method not found [404] 

Chỉ cần làm ví dụ, trong mã của tôi, tôi đã xác định phương pháp này, như vậy:

/client/js/startup/methods.js

Meteor.methods({ 
    ... 
    activeMenu: function() { 
     if(Session.get('menu')) { 
      $('.menu').removeClass('active'); 
      $('#' + Session.get('menu')).addClass('active'); 
     } 
    }, 
    ... 
}); 

và nó được gọi từ hai nơi - khi ứng dụng đầu tiên nhận được kết xuất, một nd sau router không định tuyến của nó:

client/js/rendered.js

Template.ApplicationLayout.rendered = function() { 
    Meteor.call('activeMenu'); 
} 

/client/js/utils/router.js

Router.onAfterAction(function() { 
    Meteor.call('activeMenu'); 
}); 

Mỗi phòng trong số gọi gợi lên lỗi. Tuy nhiên, phương pháp vẫn hoạt động, tôi nhận được kết quả tôi mong đợi, vì vậy các cuộc gọi phải đã thành công, nhưng tôi vẫn gặp lỗi. Các phương thức này chỉ chạy ở phía máy khách, vì chúng chỉ dành cho các mục đích trình bày. Tôi cần chương trình không có lỗi vì tôi nghi ngờ đó là lý do tại sao spiderable không hoạt động.

Trả lời

15

Bạn chỉ có phương thức gốc khi bạn sử dụng Meteor.methods bạn cần một phương thức ở phía máy chủ, trong khi phía máy khách là tùy chọn để mô phỏng bù trễ.

Cách gọi Meteor hoạt động là khi bạn chạy cuộc gọi, nó sẽ ngay lập tức kích hoạt phía máy khách để mô phỏng một số hiệu ứng giao diện người dùng trong khi phản hồi được trả về từ máy chủ, sau đó cuộc gọi phía máy chủ được kích hoạt.

Điều này tồn tại để bạn có thể có phương thức mà phản hồi có vẻ ngay lập tức, mặc dù máy chủ thực sự có thể mất thời gian để trả lời.

Vì bạn không có tương ứng với phương pháp phía máy chủ, khi Meteor gửi các cuộc gọi đến máy chủ nó có thể không tìm thấy nó và phản ứng với các lỗi Method not found [404]

Nếu bạn muốn có một phương pháp mà chỉ phía khách hàng có tác dụng, bạn nên sử dụng một phương pháp js chuẩn thay thế, mà không có từ khóa var để đảm bảo nó trên toàn cầu scoped (và có thể được truy cập từ các tập tin phía khách hàng khác)

activeMenu = function() { 
    if(Session.get('menu')) { 
     $('.menu').removeClass('active'); 
     $('#' + Session.get('menu')).addClass('active'); 
    } 
} 

Sau đó, trong các mã khác của bạn:

activeMenu() thay vì Meteor.call('activeMenu');

+1

Cảm ơn bạn rất nhiều Akshat! Tôi đã có một sự hiểu lầm lớn về những gì 'Meteor.call() 'là, điều này thực sự xóa nó lên cho tôi! Cảm ơn bạn đã dành thời gian trả lời câu hỏi của tôi chi tiết như vậy và cảm ơn bạn đã dành thời gian cho tất cả các câu trả lời khác mà bạn đưa ra. – dayuloli

1

Tôi nhận thấy rằng tên theo thứ tự chữ cái quan trọng trong việc tải ba phương thức cuộc gọi. Tôi có cùng một vấn đề khi tôi có cấu trúc tiếp theo

server 
    |----- dht-setup.js 
    |----- methods.js 

Sau đó, dht-setup không thấy phương thức method.js.Thay vào đó, tôi thay đổi tên của tệp:

server 
    |---- _methods.js 
    |---- dht-sensor.js 

404 Không tìm thấy, giải quyết. Cùng một vấn đề tôi thấy ở phía máy khách khi muốn tách các hàm khỏi các khuôn mẫu, ví dụ, tách các hàm D3js khỏi các khuôn mẫu. Bạn có thể cần đảm bảo đầu tải theo thứ tự bảng chữ cái bằng ký tự "gạch dưới" "_". Hãy xem xét rằng, làm cho các ví dụ hoạt động tốt khiến các phương thức được định nghĩa trong STARTUP.JS, tại từ chữ cái leat.

+0

Không có cách nào nên làm việc này, nhưng nó đã làm! Lol, thật là một giải pháp điên rồ. Cảm ơn nhiều. Hãy tháo nó ra để chắc chắn rằng tôi không điên, và tôi thì không. –

Các vấn đề liên quan