iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0

Methods 基本使用

Meteor 的 Methods 是一種 RPC(Remote Procedure Calling) — 瀏覽器端傳遞呼叫的程序名稱以及執行程序所需要的參數,使伺服器執行相應的程序,簡單來說 Meteor 的 Method 就是在伺服器上可以被瀏覽器端呼叫的 function。

宣告 Methods

使用 Meteor.methods() 來宣告 Methods,例如我們在 server 端加入 methods 檔案:

// my-app/server/method.js
import { Meteor } from 'meteor/meteor';

Meteor.methods({
    sayHello(name) {
        return `Hello, ${name}!`;
    },
});

呼叫 Method

試著在 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!

檢查 Method 參數

我們可以使用 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。

自行拋出 Meteor 錯誤

如果我們想要做更複雜的檢查機制,可以自行拋出錯誤,例如:

// 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。

使用 Methods 來存取資料庫

在開發 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 內建的帳號系統,和其他功能和特性都有互相整合,在加入之後安全性也將更加重要。


上一篇
Day06:MongoDB 與 Collections(二)Publish & Subscribe
系列文
30天快速上手 Meteor - 使用 Universal JavaScript Framework 開發即時聊天大平台8
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言