Meteor : "console" 变量在 require 调用中未定义
Meteor : "console" variable undefined inside require call
我在 Meteor 上遇到了一个奇怪的问题,我无法解决它:
我正在使用 Meteor、PeerJS 和 AdapterJS 开发一个 WebRTC 应用程序(它们为不受支持的浏览器(如 Safari 或 IE)提供了一个 WebRTC 插件)。这两个库是使用 NPM 下载的:meteor npm install peerjs/adapterjs
所以在我的视图控制器中我有:
view.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 构造函数时 "console" 在 peerjs/util.js 函数中未定义:
Uncaught TypeError: Cannot read property 'log' of undefined
奇怪的是,当我只需要"peerjs"时,没有异常...
我试图更改 require 函数的顺序,但它不起作用。
其他变量,如 "alert"、"window.console" 工作并在模块内部定义,但 "console" 不是.. :/
任何建议都可以帮助^^
提前致谢。
编辑:如果我在 node_module/peerjs/lib/util.js 的第一行添加断点,我看到 "console" 变量在 util.js 中是 "undefined" 但是 .. .. 它是在调用函数 (fileEvaluate) 中定义的!
EDIT2:我尝试了其他方法来检查 adapterjs 中的代码是否重新定义或更改了某些内容:我将 'require("adapterjs")' 放入超时函数中并延迟很长时间(10 秒)并且......控制台仍然对等模块内未定义!但是当我评论 require("adapterjs") 时,没有错误,控制台被定义了!我认为 Meteor 在 运行 根据需要的函数设置控制器脚本之前做了一些特别的事情...
EDIT3:这是一个 git 用于测试项目的回购协议:gitlab.com
如果你显示开发控制台,你会看到异常。
我在 adapter.js 的第 860+ 行中看到正在从 https://github.com/Temasys/AdapterJS/blob/master/source/adapter.js
定义控制台(shim 的一部分)
// 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 的原因是出于兼容性目的 - 这将帮助您解决问题。请让我知道你发现了什么,因为我会沿着这条路跟着你:)
我找到了解决办法,虽然我自己并不完全理解。这与 Meteor 导入模块的方式有关,而 Peerjs 与此冲突。
基本上我将 node_modules/peerjs/dist/peer.js 复制到客户端目录中,以便 Meteor 加载它 "as is".
对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({
而且效果很好:)
我在 Meteor 上遇到了一个奇怪的问题,我无法解决它:
我正在使用 Meteor、PeerJS 和 AdapterJS 开发一个 WebRTC 应用程序(它们为不受支持的浏览器(如 Safari 或 IE)提供了一个 WebRTC 插件)。这两个库是使用 NPM 下载的:meteor npm install peerjs/adapterjs
所以在我的视图控制器中我有:
view.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 构造函数时 "console" 在 peerjs/util.js 函数中未定义:
Uncaught TypeError: Cannot read property 'log' of undefined
奇怪的是,当我只需要"peerjs"时,没有异常... 我试图更改 require 函数的顺序,但它不起作用。 其他变量,如 "alert"、"window.console" 工作并在模块内部定义,但 "console" 不是.. :/
任何建议都可以帮助^^
提前致谢。
编辑:如果我在 node_module/peerjs/lib/util.js 的第一行添加断点,我看到 "console" 变量在 util.js 中是 "undefined" 但是 .. .. 它是在调用函数 (fileEvaluate) 中定义的!
EDIT2:我尝试了其他方法来检查 adapterjs 中的代码是否重新定义或更改了某些内容:我将 'require("adapterjs")' 放入超时函数中并延迟很长时间(10 秒)并且......控制台仍然对等模块内未定义!但是当我评论 require("adapterjs") 时,没有错误,控制台被定义了!我认为 Meteor 在 运行 根据需要的函数设置控制器脚本之前做了一些特别的事情...
EDIT3:这是一个 git 用于测试项目的回购协议:gitlab.com 如果你显示开发控制台,你会看到异常。
我在 adapter.js 的第 860+ 行中看到正在从 https://github.com/Temasys/AdapterJS/blob/master/source/adapter.js
定义控制台(shim 的一部分)// 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 的原因是出于兼容性目的 - 这将帮助您解决问题。请让我知道你发现了什么,因为我会沿着这条路跟着你:)
我找到了解决办法,虽然我自己并不完全理解。这与 Meteor 导入模块的方式有关,而 Peerjs 与此冲突。
基本上我将 node_modules/peerjs/dist/peer.js 复制到客户端目录中,以便 Meteor 加载它 "as is".
对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({
而且效果很好:)