Meteor 的 Methods 是一種 RPC(Remote Procedure Calling) — 瀏覽器端傳遞呼叫的程序名稱以及執行程序所需要的參數,使伺服器執行相應的程序,簡單來說 Meteor 的 Method 就是在伺服器上可以被瀏覽器端呼叫的 function。
使用 Meteor.methods()
來宣告 Methods,例如我們在 server 端加入 methods
檔案:
// my-app/server/method.js
import { Meteor } from 'meteor/meteor';
Meteor.methods({
sayHello(name) {
return `Hello, ${name}!`;
},
});
試著在 client 端呼叫該 Method,使用 Meteor.call(Method名稱, 參數, callback)
,多個參數用逗點隔開,例如:
// my-app/client/hello.js
import { Meteor } from 'meteor/meteor';
Meteor.call('sayHello', 'Max', (error, result) => {
console.log(result);
});
在瀏覽器開發人員工具的 console 就會看到 Hello, Max!
。
我們可以使用 check
套件來檢查 Method 的參數。只要加入套件:meteod add check
,就可以在定義 Method 時加入檢查的機制:
// my-app/server/method.js
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
Meteor.methods({
sayHello(name) {
check(name, String); // 檢查 name 參數,若不是字串型別就拋出錯誤
return `Hello, ${name}!`;
},
});
如果把 'Max'
改成任意的數字:
// my-app/client/hello.js
import { Meteor } from 'meteor/meteor';
Meteor.call('sayHello', 1, (error, result) => {
if (error) console.log(error);
else console.log(result);
});
在 console 會看到 Match failed [400]
,這是檢查沒有通過所產生的 error message。
如果我們想要做更複雜的檢查機制,可以自行拋出錯誤,例如:
// my-app/server/method.js
import { Meteor } from 'meteor/meteor';
import { check } from 'meteor/check';
Meteor.methods({
sayHello(name) {
check(name, String);
if (name !== 'Max') throw new Meteor.Error(401, 'Unauthorized', 'Are you Max?')
return `Hello, ${name}!`;
},
});
如果把 'Max'
改成其他的字串再呼叫一次,在 console 則會看到自行定義的 error message。
在開發 prototype 時,可以安裝 insecure
套件讓使用者從瀏覽器端直接對資料庫進行存取,但在正式環境這種行為是非常不安全的,因此我們必須移除 insecure
套件並且使用 Methods 來避免這種行為,例如昨天的這一段程式碼:
// my-app/client/hello.js
Template.hello.events({
'keyup #myInput'(event, templateInstance) {
if (event.keyCode === 13) {
Todos.insert({
text: event.currentTarget.value,
date: new Date(),
});
event.currentTarget.value = '';
}
},
});
我們把 update 的邏輯移至後端改寫成 Method:
// my-app/server/method.js
import { Meteor } from 'meteor/meteor';
import Todos from './todos';
Meteor.methods({
insertTodo(text) {
return Todos.insert({ text, date: new Date() });
},
});
然後呼叫該 Method:
// my-app/client/hello.js
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
Template.hello.events({
'keyup #myInput'(event, templateInstance) {
if (event.keyCode === 13) {
Meteor.call('insertTodo', event.currentTarget.value, (error, result) => {
if (error) console.log(error);
else event.currentTarget.value = '';
});
}
},
});
如此就能達到同樣的目的。明天會介紹 Meteor 內建的帳號系統,和其他功能和特性都有互相整合,在加入之後安全性也將更加重要。