У меня была аналогичная проблема. Я хотел иметь два разных интерфейса (хотя оба предназначены для настольных компьютеров) для одного и того же сервера, чтобы они могли использовать одну и ту же базу данных, публикации и методы. После просмотра исходного кода Meteor (версия 1.1.0.3) мне удалось сделать это следующим образом.
1) Запустите проект базового сервера.
$ meteor --port 3100
2) В проектах внешнего интерфейса добавьте следующее в server/server.config.js
.
var backendUrl = process.env.BACKEND_URL;
if (backendUrl) {
__meteor_runtime_config__.BACKEND_URL = backendUrl;
__meteor_runtime_config__.ACCOUNTS_CONNECTION_URL = backendUrl;
console.log('config', __meteor_runtime_config__);
}
3) В внешних проектах добавьте следующее в client/lib/client.connection.js
. APS
— это просто пространство имен для моего приложения. Обязательно загрузите его, прежде чем использовать подписки или методы (поэтому он находится в папке lib
).
if (typeof APS == 'undefined') APS = {};
var backendUrl = __meteor_runtime_config__.BACKEND_URL;
if (backendUrl) {
APS.backendConnection = DDP.connect(backendUrl);
Meteor.connection = APS.backendConnection;
_.each(['subscribe', 'methods', 'call', 'apply', 'status', 'reconnect', 'disconnect'], function(name) {
Meteor[name] = _.bind(Meteor.connection[name], Meteor.connection);
});
console.log('connected to backend', APS.backendConnection);
}
4) Запустите внешний сервер с переменной среды BACKEND_URL
, указывающей на внутренний сервер.
$ BACKEND_URL=http://192.168.33.10:3100 meteor
Это все. Обновление на клиенте работает нормально. И нам не нужно возиться с Accounts.*
.
ОБНОВЛЕНИЕ: только что обнаружил проблему с моим решением. При вызове серверных методов this.userId
всегда равно null
. Это потому, что Meteor.connection
и Accounts.connection
были двумя отдельными соединениями, несмотря на одно и то же BACKEND_URL
. При аутентификации идентификатор пользователя ассоциируется только с последним. Фиксированный client.connection.js
выглядит следующим образом.
if (typeof APS == 'undefined') APS = {};
var backendUrl = __meteor_runtime_config__.BACKEND_URL;
if (backendUrl) {
APS.originalConnection = Meteor.connection;
// Accounts is already connected to our BACKEND_URL
APS.backendConnection = Accounts.connection;
// Reusing same (authenticated) connection for method calls and subscriptions
Meteor.connection = APS.backendConnection;
_.each(['subscribe', 'methods', 'call', 'apply', 'status', 'reconnect', 'disconnect'], function(name) {
Meteor[name] = _.bind(Meteor.connection[name], Meteor.connection);
});
console.log('Connected to backend', APS.backendConnection);
}
person
vgrechka
schedule
12.08.2015