1

我在 Meteor 上遇到了一个奇怪的问题,我无法解决:

我正在使用 Meteor、PeerJS 和 AdapterJS 开发一个 WebRTC 应用程序(它们为 Safari 或 IE 等不受支持的浏览器提供了一个 WebRTC 插件)。这两个库是使用 NPM 下载的:meteor npm install peerjs/adapterjs

所以在我看来的控制器中,我有:

视图.js

//import Peer from 'peerjs'; => same error with "import"
//import AdapterJS from 'adapterjs';
Template.view.onRendered(function(){

    AdapterJS = require("adapterjs");
    Peer = require("peerjs");
    //var peerkey="..."
    var peer = new Peer({
      key: peerkey,  // get a free key at http://peerjs.com/peerserver
      debug: 3,
      config: {'iceServers': [
        { url: 'stun:stun.l.google.com:19302' },
        { url: 'stun:stun1.l.google.com:19302' },
      ]}
    });

但是当我运行我的控制器时,我得到一个异常,因为调用 peerjs 构造函数时在 peerjs/util.js 函数中未定义“控制台”:

未捕获的类型错误:无法读取未定义的属性“日志”

奇怪的是,当我只需要“peerjs”时,没有例外......我试图改变 require 函数的顺序,但它不起作用。其他变量,如“alert”、“window.console”工作并在模块内定义,但“console”不是..:/

任何建议都可以帮助^^

提前致谢。

编辑:如果我在 node_module/peerjs/lib/util.js 的第一行添加一个断点,我看到“console”变量在 util.js 中是“未定义的”但是....它是在调用者函数中定义的(文件评估)!

EDIT2:我尝试了其他方法来检查adapterjs中的代码是否重新定义或更改了某些内容:我将'require(“adapterjs”)'放在超时函数中,延迟很长(10秒),并且......控制台内部仍未定义对等模块!但是当我评论 require("adapterjs") 时,没有错误,控制台被定义了!我认为 Meteor 在运行控制器脚本之前根据需要的功能做了一些特别的事情......

EDIT3:这是一个测试项目的 git repo:gitlab.com 如果您显示开发控制台,您将看到异常。

4

2 回答 2

0

我在 adapter.js 的第 860+ 行看到正在从https://github.com/Temasys/AdapterJS/blob/master/source/adapter.js定义控制台(垫片的一部分)

// IE 9 is not offering an implementation of console.log until you open a console
if (typeof console !== 'object' || typeof console.log !== 'function') {
    /* jshint -W020 */
    console = {} || console;
    // Implemented based on console specs from MDN
    // You may override these functions
    console.log = function (arg) {};
    console.info = function (arg) {};
    console.error = function (arg) {};

如果找不到它喜欢的控制台,则此代码定义控制台?这是否意味着您使用的是 IE9 或其他不兼容的浏览器?

尝试将其粘贴到您的控制台中,看看它告诉您什么:

if (typeof console !== 'object' || typeof console.log !== 'function') alert("Console not present, needs to be shimmed?"); else console.log("console is ok");

大概您使用 adapter.js 的原因是出于兼容性目的 - 这将帮助您解决问题。请让我知道你发现了什么,因为我会跟着你走这条路:)

于 2016-10-03T20:56:40.263 回答
0

我找到了一个解决方案,虽然我自己并不完全理解。这与 Meteor 导入模块的方式有关,而 Peerjs 与此相冲突。

基本上我将 node_modules/peerjs/dist/peer.js 复制到客户端目录中,这样 Meteor 就会“按原样”加载它。

main.js 的小改动如下:

import './main.html';

// I placed peer.js from the node_modules/peerjs/dist/peer.js into the client folder and it works fine
// import {Peer} from 'peerjs';
import {AdapterJS as Adapter} from 'adapterjs';

Template.hello.onCreated(function helloOnCreated() {
    // counter starts at 0

    window.peer = new Peer({

它工作正常:)

于 2016-10-04T20:31:59.957 回答