Почему я не могу расширить карман каждого в nowjs?

Я пытаюсь предоставить функции в каждом pocket из nowjs. Я хотел бы сделать это, _.extend набив всем карманы, т.е. everyone.now. По какой-то причине, которую я не могу понять, _.extend не может должным образом предоставить функцию на стороне клиента.

Это мой текущий код:

var _ = require("underscore"),
    everyone = require("nowjs").initialize(app);

everyone.now.foo = function() {};

_.extend(everyone.now, {
    bar: function() {}
});

console.log(everyone.now.foo); // [Function]
console.log(everyone.now.bar); // undefined

Как на стороне сервера, так и на стороне клиента я могу сделать now.foo() просто отлично. С другой стороны, now.bar() терпит неудачу, потому что now.bar не определено. Это имеет место как на стороне клиента, так и на стороне сервера. Я попытался проверить наличие на стороне сервера, как показано выше в последней строке. Однако эта строка регистрирует undefined.

Функция Underscore extend (очевидно) работает с другими объектами, поэтому я предполагаю, что это как-то связано с «магическим пространством имен», которое использует nowjs.

Почему расширение не работает с everyone.now и как заставить его работать?


Изменить 2: я еще немного покопался в прокси. Похоже, установка свойства на прокси путем передачи переменной, так как ее имя не работает. Я удалил свое первое редактирование, потому что этот тестовый пример более сужен.

Почему это не работает? Это ошибка? (Большинство раз я спрашиваю об этом сам, я знаю, что это не так, но это действительно делает меня невежественным...)

var proxy = Proxy.create({
    get: function(pr, name) {
        console.log("get called");
        return null;
    },

    set: function(pr, name, value) {
        console.log("set called");
    }
});

var key = "foo";

proxy["foo"] = "bar";
proxy[ key ] = "bar";

proxy["foo"];
proxy[ key ];

Результат журнала:

set called
get called
get called

Судя по всему, proxy[ key ] = "bar"; не вызывает set на прокси. Это почему?


person pimvdb    schedule 04.12.2011    source источник
comment
Выполнение того же самого в моей системе дает ожидаемый результат двух вызовов каждой функции. Какая у вас версия node и node-proxy?   -  person loganfsmyth    schedule 05.12.2011
comment
@Logan F. Smyth: я работаю на узле 0.6.5, который вышел вчера. Я запускаю узел с флагом --harmony_proxies, поэтому мне не нужна сторонняя библиотека. Возможно, реализация V8 на данный момент содержит ошибки, а node-proxy — нет. Я проверю это, спасибо.   -  person pimvdb    schedule 05.12.2011


Ответы (1)


Они опубликовали запись в блоге на веб-сайте NowJS о том, как использовать node-proxy на Windows вместо собственной реализации V8 с использованием флага --harmony_proxies.

Оказалось, что версия V8, которую в настоящее время использует Node, содержит несколько ошибок в отношении прокси-серверов, которые вызывали странное поведение, как указано в вопросе. node-proxy, однако, — это модуль, который включает прокси (ядро «волшебного пространства имен» NowJS) без этих ошибок. (Ошибки исправлены и в более новой версии V8, но для этого потребуется специальная сборка Node.)

Я просто не мог понять, как собрать node-proxy в Windows (это дополнение .node, а не чистый JavaScript). В приведенном выше сообщении в блоге они распространили скомпилированный модуль, и теперь все работает как часы.

Чинить:

  • Загрузите скомпилированный модуль
  • Распакуйте папку в папку node_modules и переименуйте ее в now
  • Не запускайте Node с флагом прокси

Изменить: Node 0.7.0 использует версию 8 3.8.6, которая также решает эту проблему. Просто запустите с флагом --harmony и удалите ссылку на node-proxy.

person pimvdb    schedule 10.01.2012