jsdom.env не работает на node.js C9
Поэтому я недавно работал с Node.js на C9 и столкнулся с этой проблемой в файле javascript:
jsdom.env("", function(err, window) {
TypeError: jsdom.env is not a function
Вот мой код:
var jsdom = require('jsdom');
var $;
jsdom.env("", function(err, window) {
console.log("what");
if (err) {
console.error(err);
return;
}
$ = require("jquery")(window);
$.ajax(settings).done(function (response) {
console.log(response);
});
});
Я обновил все свои зависимости, а также сам узел, но все еще получаю эту проблему. Кто-нибудь знает, что случилось?
2 ответа
Я столкнулся с той же проблемой. Искал решение по всей сети. Оказалось, что jsdom обновил некоторые из своих функций начиная с v10. Итак, я хотел использовать jQuery в конце экспресс-приложения Node.js и должен был сделать это, как показано ниже:
var jsdom = require('jsdom');
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.document = document;
var $ = jQuery = require('jquery')(window);
.env () устарела начиная с v10. Надеюсь, что это поможет вам или всем, кто сталкивался с такими проблемами.
Как упоминалось выше, .env() устарела.
Используйте следующее:
const { window } = new JSDOM(``, { runScripts: "dangerously" });
const myLibrary = fs.readFileSync("../../whatever.js", { encoding: "utf-8" });
const scriptEl = window.document.createElement("script");
scriptEl.textContent = myLibrary;
window.document.body.appendChild(scriptEl);
Что касается ответа выше и из документов JSDOM:
Не вставляйте глобальные jsdom в глобальный узел
Обычный антипаттерн, который мы видим, когда люди используют jsdom, копирует глобалы из окна jsdom в глобал Node.js, а затем пытается запустить код, предназначенный для браузера, внутри Node.js. Это очень плохо, и вы не должны этого делать. Он запускает код, предназначенный для веб-браузера, в некой гибридной среде franken-среды, загрязненной множеством глобальных переменных, которые здесь не имеют смысла, и теряет все преимущества изоляции вашего кода в окне jsdom.
https://github.com/jsdom/jsdom/wiki/Don%27t-stuff-jsdom-globals-onto-the-Node-global
Шаг 1: npm установить jquery
Шаг 2: npm установить jsdom
<!-- language: lang-js -->
//add dummy function to test jquery in Node
function fn1( value ){ console.log( "fn1 says " + value );}
function fn2( value ) {console.log( "fn2 says " + value ); return false;}
var jsdom = require('jsdom');
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
//comment out the line below it create problem
//global.document = document;
var $ = jQuery = require('jquery')(window);
var callbacks = $.Callbacks();
callbacks.add(fn1);
callbacks.fire("foo!");
callbacks.add( fn2 );
callbacks.fire( "fool!" );