var net = require('net');
var clientSocket = new net.Socket();
clientSocket.on('connect', function () {
console.log('Connected to Google.');
});
clientSocket.on('data', function (data) {
console.log(data.toString());
});
clientSocket.on('end', function () {
console.log('Google sent all data.');
});
clientSocket.on('close', function () {
console.log('Connection closed.');
});
clientSocket.on('error', function (error) {
throw error;
});
clientSocket.connect(80, 'google.com', function (error) {
if (error) {throw error;}
});
clientSocket.write('GET /index.html HTTP/1.0'); // Передаем тип запроса GET или POST и какую страницу хотим загрузить - index.html
clientSocket.write('Accept-Encoding: gzip, compress');
// clientSocket.write('Host: 127.0.0.1');
// clientSocket.write('User-Agent: My programm');
// clientSocket.write('Accept-Language: en');
clientSocket.write(''); // Обязательно должна в конце отправлять пустая строка.
clientSocket.end();
пятница, 6 апреля 2018 г.
понедельник, 26 марта 2018 г.
Ошибка System.js traceur.js 404 Not Found - Как исправить - Инструкция
При загрузке файлов с помощью SystemJS часто возникает ошибка:
http://localhost:8000/traceur 404 (Not Found)
Возникает она, как правило, из-за того, что скорее всего в своем коде вы с помощью многострочных комментариев закомментировали импорты в своих файлах/
/*
import SomeThing from 'somewhere';
*/
В коде файла system.js есть регулярное выражение, которое обнаруживает закомментированные импорты и пытается из обработать, что приводит к ошибке.
var esmRegEx = /(^\s*|[}\);\n]\s*)(import\s*(['"]|(\*\s+as\s+)?[^"'\(\)\n;]+\s*from\s*['"]|\{)|export\s+\*\s+from\s+["']|export\s*(\{|default|function|class|var|const|let|async\s+function))/;
Для того. чтобы ошибку устранить вам надо удалить закомментированные импорты из вашего кода.
Или, если вам надо оставить комментарии, то чтобы ошибка не проявлялась, просто добавьте кавычки вокруг слова import.
/*
"import" SomeThing from 'somewhere';
*/
В крайнем случае в конфиге tsconfig.json для TypeScript можно прописать настройку, чтобы он не оставлял в коде комментарии при транспиляции.
{
"compilerOptions": {
"removeComments": true
}
}
Также ошибка может быть вызвана тем, что вы пытаетесь загрузить в своем коде некорректный UMD-файл.
Убедитесь также, что вы загружаете JavaScript, а не TypeScript-файлы.
http://localhost:8000/traceur 404 (Not Found)
Возникает она, как правило, из-за того, что скорее всего в своем коде вы с помощью многострочных комментариев закомментировали импорты в своих файлах/
/*
import SomeThing from 'somewhere';
*/
В коде файла system.js есть регулярное выражение, которое обнаруживает закомментированные импорты и пытается из обработать, что приводит к ошибке.
var esmRegEx = /(^\s*|[}\);\n]\s*)(import\s*(['"]|(\*\s+as\s+)?[^"'\(\)\n;]+\s*from\s*['"]|\{)|export\s+\*\s+from\s+["']|export\s*(\{|default|function|class|var|const|let|async\s+function))/;
Для того. чтобы ошибку устранить вам надо удалить закомментированные импорты из вашего кода.
Или, если вам надо оставить комментарии, то чтобы ошибка не проявлялась, просто добавьте кавычки вокруг слова import.
/*
"import" SomeThing from 'somewhere';
*/
В крайнем случае в конфиге tsconfig.json для TypeScript можно прописать настройку, чтобы он не оставлял в коде комментарии при транспиляции.
{
"compilerOptions": {
"removeComments": true
}
}
Также ошибка может быть вызвана тем, что вы пытаетесь загрузить в своем коде некорректный UMD-файл.
Убедитесь также, что вы загружаете JavaScript, а не TypeScript-файлы.
среда, 21 марта 2018 г.
Вынос внешних файлов из сборки Webpack
Файл webpack.config.js
const path = require('path')
, CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = [
{
entry: path.resolve(__dirname, 'src/index.js')
, output: {
path: path.resolve(__dirname, 'dist')
, filename: 'bundle.js'
}
, externals: { // Модули, которые надо из итогового файла сборки исключить. Они будут загружаться отдельно.
'./my-module.js': 'a'
, './lodash.js': '_' // Заменить импорт модуля на имя этой глобальной перемеменной: require('lodash') --> var _ В итоговый файл попадет: {1: function (...) {module.exports = _;}}
, './jquery.js': '$' // Заменить импорт модуля на имя этой глобальной перемеменной: require('jquery') --> var jQuery В итоговый файл попадет: {1: function (...) {module.exports = jQuery;}}
}
, plugins: [
new CleanWebpackPlugin(['dist'])
]
, bail: true
}
];
Файл index.js
import a from './my-module.js';
import * as _ from './lodash.js';
import * as $ from './jquery.js';
a();
console.log(_.tail([1, 2, 3]));
console.log($);
Файл my-module.js
export function a () {
console.log(1);
}
Скомпилированный файл my-module-compiled.js
function a () {
console.log(1);
}
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="src/my-module-compiled.js"></script>
<script src="src/lodash.js"></script>
<script src="src/jquery.js"></script>
<title>Webpack App</title>
</head>
<body>
<script src="dist/bundle.js"></script>
</body>
</html>
Система преобразования типов в JavaScript.
Система преобразования типов в JavaScript очень простая.
В JavaScript есть всего 3 приведения типов:
1) Строковое - String() - приведение к строке в строковом контексте. Происходит, например, при конкатенации строк ("abc" + 10). Строковое преобразование происходит при необходимости представления чего-либо в виде строки.
2) Числовое - Number() - приведение к примитиву в числовом контексте, включая унарный плюс (+value). Происходит при сравнении разных типов (==, !=, >=, <=). Числовое преобразование происходит в математических выражениях (_, *, /, %), а также при сравнении.
3) Логическое - Boolean() - приведение к логическому типу в логическом контексте (if, &&, ||). Логическое преобразование происходит при приведение к true и false в логическом контексте, например в условиях и при применении логических операторов. Все значения, которые можно трактовать как пустые, становятся false: пустая строка, 0, null, undefined, NaN. Все остальное трактовать как true.
Особым случаем является проверка на равенство таких специальных типов как Null и Undefined. Они равны только друг другу и неравны всему остальному:
null == null
undefined == undefined
undefined == null
null == undefined
В JavaScript логическое преобразование особенно интересно своим сочетанием с числовым.
Приведем пример.
var a = 0;
var b = "0";
console.log(a == b); // true
Когда мы сравниваем число 0 и строку "0", то мы сравниваем их не в логическом контексте, а в числовом.
Поэтому у нас получается такое сравнение с преобразованием типов:
console.log(Number(0) == Number("0")); // true
Разберем другой код:
var bool = new Boolean(false); // bool = object
if (bool) {console.log(bool);} // Boolean(bool) = true, поэтому if (true) {console.log(false);}
if (bool == false) {console.log(bool);} // bool.valueOf() = false, поэтому if (false == false) {console.log(false);}
Мы используем класс Boolean, который создает не примитив, а объект bool - экземпляр класса Boolean.
Если bool - это объект, то в логическом контексте он всегда будет приведен к true.
Если мы производим сравнение, то тут сработает числовое сравнение, при котором будет вызван метод bool.valueOf().
В JavaScript есть всего 3 приведения типов:
1) Строковое - String() - приведение к строке в строковом контексте. Происходит, например, при конкатенации строк ("abc" + 10). Строковое преобразование происходит при необходимости представления чего-либо в виде строки.
2) Числовое - Number() - приведение к примитиву в числовом контексте, включая унарный плюс (+value). Происходит при сравнении разных типов (==, !=, >=, <=). Числовое преобразование происходит в математических выражениях (_, *, /, %), а также при сравнении.
3) Логическое - Boolean() - приведение к логическому типу в логическом контексте (if, &&, ||). Логическое преобразование происходит при приведение к true и false в логическом контексте, например в условиях и при применении логических операторов. Все значения, которые можно трактовать как пустые, становятся false: пустая строка, 0, null, undefined, NaN. Все остальное трактовать как true.
Особым случаем является проверка на равенство таких специальных типов как Null и Undefined. Они равны только друг другу и неравны всему остальному:
null == null
undefined == undefined
undefined == null
null == undefined
В JavaScript логическое преобразование особенно интересно своим сочетанием с числовым.
Приведем пример.
var a = 0;
var b = "0";
console.log(a == b); // true
Когда мы сравниваем число 0 и строку "0", то мы сравниваем их не в логическом контексте, а в числовом.
Поэтому у нас получается такое сравнение с преобразованием типов:
console.log(Number(0) == Number("0")); // true
Разберем другой код:
var bool = new Boolean(false); // bool = object
if (bool) {console.log(bool);} // Boolean(bool) = true, поэтому if (true) {console.log(false);}
if (bool == false) {console.log(bool);} // bool.valueOf() = false, поэтому if (false == false) {console.log(false);}
Мы используем класс Boolean, который создает не примитив, а объект bool - экземпляр класса Boolean.
Если bool - это объект, то в логическом контексте он всегда будет приведен к true.
Если мы производим сравнение, то тут сработает числовое сравнение, при котором будет вызван метод bool.valueOf().
пятница, 16 марта 2018 г.
Browser XMLHttpRequest and Node Server
Файл server.js
var http = require('http')
, fs = require('fs')
, path = require('path')
, url = require('url')
, querystring = require('querystring');
var server = http.createServer();
server.on('request', function (request, response) {
if (request.method === 'POST' && url.parse(request.url).path === '/ajax') {
var data = [];
request.on('data', function (chunk) {data.push(chunk)});
request.on('end', function () {
setTimeout(function () {
response.writeHead(200, {'Content-Type': 'text/plain'});
var query = querystring.parse(data.join());
response.end(query.data);
}, 1000);
});
} else {
fs.readFile(path.resolve(path.join(__dirname, 'index.html')), function (error, indexHTML) {
if (error) {throw error;}
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(indexHTML);
});
}
});
server.listen(80, '127.0.0.1', function (error) {
if (error) {throw error;}
console.log('Server started at 127.0.0.1:80');
});
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>XMLHttpRequest</title>
</head>
<body>
<div id="server-response"></div>
<script type="text/javascript">
setTimeout(function () {
var request = new XMLHttpRequest();
if (request.readyState === 0) {
console.log('readyState 0 UNSENT: ' + (request.readyState === request.UNSENT));
}
request.open('POST', '/ajax', true, 'username', 'password');
if (request.readyState === 1) {
console.log('readyState 1 OPENED: ' + (request.readyState === request.OPENED));
}
request.onreadystatechange = function () {
if (request.readyState === 2) {
console.log('readyState 2 HEADERS_RECEIVED: ' + (request.readyState === request.HEADERS_RECEIVED));
}
if (request.readyState === 3) {
console.log('readyState 3 LOADING: ' + (request.readyState === request.LOADING));
}
if (request.readyState === 4) {
console.log('readyState 4 DONE: ' + (request.readyState === request.DONE));
}
if (request.readyState === 4) {
var response = this;
if (response.status === 200) {
document.getElementById('server-response').innerHTML = (
'<p>RESPONSE STATUS:</p>'
+ '<p>' + response.status + '</p>'
+ '<p>RESPONSE STATUS TEXT:</p>'
+ '<p>' + response.statusText + '</p>'
+ '<p>HEADERS:</p>'
+ '<p>' + response.getAllResponseHeaders() + '</p>'
+ '<p>HEADER CONTENT_TYPE:</p>'
+ '<p>' + response.getResponseHeader('Content-Type') + '</p>'
+ '<p>RESPONSE URL:</p>'
+ '<p>' + response.responseURL + '</p>'
+ '<p>RESPONSE:</p>'
+ '<p>' +response.response + '</p>'
+ '<p>RESPONSE TEXT:</p>'
+ '<p>' + response.responseText + '</p>'
);
} else {
document.getElementById('server-response').innerHTML = 'Error. Status code: ' + response.status + ', status text: ' + response.statusText;
}
}
};
request.timeout = 2000;
request.ontimeout = function () {document.getElementById('server-response').innerHTML = 'Timeout'};
request.onabort = function () {document.getElementById('server-response').innerHTML = 'Abort'};
request.onerror = function (event) {document.getElementById('server-response').innerHTML = 'Error. Server is not available. Status code: ' + event.target.status;};
if (request.overrideMimeType) {request.overrideMimeType('text/plain', 'x-user-defined');}
request.setRequestHeader('My-Header', 'abcdef');
request.withCredentials = true;
request.responseType = 'text';
request.send('data=123&value=456');
setTimeout(function () {request.abort();}, 500);
}, 5000);
</script>
</body>
</html>
var http = require('http')
, fs = require('fs')
, path = require('path')
, url = require('url')
, querystring = require('querystring');
var server = http.createServer();
server.on('request', function (request, response) {
if (request.method === 'POST' && url.parse(request.url).path === '/ajax') {
var data = [];
request.on('data', function (chunk) {data.push(chunk)});
request.on('end', function () {
setTimeout(function () {
response.writeHead(200, {'Content-Type': 'text/plain'});
var query = querystring.parse(data.join());
response.end(query.data);
}, 1000);
});
} else {
fs.readFile(path.resolve(path.join(__dirname, 'index.html')), function (error, indexHTML) {
if (error) {throw error;}
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(indexHTML);
});
}
});
server.listen(80, '127.0.0.1', function (error) {
if (error) {throw error;}
console.log('Server started at 127.0.0.1:80');
});
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>XMLHttpRequest</title>
</head>
<body>
<div id="server-response"></div>
<script type="text/javascript">
setTimeout(function () {
var request = new XMLHttpRequest();
if (request.readyState === 0) {
console.log('readyState 0 UNSENT: ' + (request.readyState === request.UNSENT));
}
request.open('POST', '/ajax', true, 'username', 'password');
if (request.readyState === 1) {
console.log('readyState 1 OPENED: ' + (request.readyState === request.OPENED));
}
request.onreadystatechange = function () {
if (request.readyState === 2) {
console.log('readyState 2 HEADERS_RECEIVED: ' + (request.readyState === request.HEADERS_RECEIVED));
}
if (request.readyState === 3) {
console.log('readyState 3 LOADING: ' + (request.readyState === request.LOADING));
}
if (request.readyState === 4) {
console.log('readyState 4 DONE: ' + (request.readyState === request.DONE));
}
if (request.readyState === 4) {
var response = this;
if (response.status === 200) {
document.getElementById('server-response').innerHTML = (
'<p>RESPONSE STATUS:</p>'
+ '<p>' + response.status + '</p>'
+ '<p>RESPONSE STATUS TEXT:</p>'
+ '<p>' + response.statusText + '</p>'
+ '<p>HEADERS:</p>'
+ '<p>' + response.getAllResponseHeaders() + '</p>'
+ '<p>HEADER CONTENT_TYPE:</p>'
+ '<p>' + response.getResponseHeader('Content-Type') + '</p>'
+ '<p>RESPONSE URL:</p>'
+ '<p>' + response.responseURL + '</p>'
+ '<p>RESPONSE:</p>'
+ '<p>' +response.response + '</p>'
+ '<p>RESPONSE TEXT:</p>'
+ '<p>' + response.responseText + '</p>'
);
} else {
document.getElementById('server-response').innerHTML = 'Error. Status code: ' + response.status + ', status text: ' + response.statusText;
}
}
};
request.timeout = 2000;
request.ontimeout = function () {document.getElementById('server-response').innerHTML = 'Timeout'};
request.onabort = function () {document.getElementById('server-response').innerHTML = 'Abort'};
request.onerror = function (event) {document.getElementById('server-response').innerHTML = 'Error. Server is not available. Status code: ' + event.target.status;};
if (request.overrideMimeType) {request.overrideMimeType('text/plain', 'x-user-defined');}
request.setRequestHeader('My-Header', 'abcdef');
request.withCredentials = true;
request.responseType = 'text';
request.send('data=123&value=456');
setTimeout(function () {request.abort();}, 500);
}, 5000);
</script>
</body>
</html>
четверг, 15 марта 2018 г.
new XMLHttpRequest()
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://www.site.com/', true, 'username', 'password');
xhr.withCredentials = true;
xhr.timeout = 120000;
xhr.setRequestHeader('My-Header', '123');
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200 || xhr.status === 0) {
console.log('status: ' + xhr.status === 1223 ? 204 : xhr.status);
console.log('statusText: ' + xhr.status === 1223 ? 'No Content' : xhr.statusText);
console.log('getAllResponseHeaders: ' + xhr.getAllResponseHeaders());
console.log('getResponseHeader: ' + xhr.getResponseHeader('Content-Type'));
console.log('responseText: ' + xhr.responseText);
} else {
console.log('Error in request.');
}
}
};
xhr.onabort = function () {
if (!xhr) {return;}
xhr = null;
console.log('Aborted.');
};
xhr.ontimeout = function () {
xhr = null;
console.log('Timeout.');
};
xhr.onerror = function (error) {
xhr = null;
console.log('Error.');
console.log(error.message);
};
xhr.send(JSON.stringify({a: 1, b: 2}));
setTimeout(function () {
if (xhr) {xhr.abort();}
}, 1000);
xhr.open('POST', 'http://www.site.com/', true, 'username', 'password');
xhr.withCredentials = true;
xhr.timeout = 120000;
xhr.setRequestHeader('My-Header', '123');
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200 || xhr.status === 0) {
console.log('status: ' + xhr.status === 1223 ? 204 : xhr.status);
console.log('statusText: ' + xhr.status === 1223 ? 'No Content' : xhr.statusText);
console.log('getAllResponseHeaders: ' + xhr.getAllResponseHeaders());
console.log('getResponseHeader: ' + xhr.getResponseHeader('Content-Type'));
console.log('responseText: ' + xhr.responseText);
} else {
console.log('Error in request.');
}
}
};
xhr.onabort = function () {
if (!xhr) {return;}
xhr = null;
console.log('Aborted.');
};
xhr.ontimeout = function () {
xhr = null;
console.log('Timeout.');
};
xhr.onerror = function (error) {
xhr = null;
console.log('Error.');
console.log(error.message);
};
xhr.send(JSON.stringify({a: 1, b: 2}));
setTimeout(function () {
if (xhr) {xhr.abort();}
}, 1000);
понедельник, 5 марта 2018 г.
AJAX загрузка картинок
<html>
<body>
<script language="javascript" type="text/javascript">
function send_with_ajax ( ) {
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(exception) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
alert("Your browser does not support XMLHTTP Request...!");
}
xhr.open("GET", "300x300.gif", true); // Make sure file is in same server
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function() {
if (xhr.readyState == 4){
if ((xhr.status == 200) || (xhr.status == 0)){
var image = document.getElementById("get_img");
image.src = "data:image/gif;base64," + encode64(xhr.responseText);
}else{
alert("Something misconfiguration : " +
"\nError Code : " + xhr.status +
"\nError Message : " + xhr.responseText);
}
}
};
xhr.send(null);
}
function encode64 (inputStr) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var outputStr = "";
var i = 0;
while (i> 2;
var enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);
var enc3, enc4;
if (isNaN(byte2)){
enc3 = enc4 = 64;
} else{
enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);
if (isNaN(byte3)){
enc4 = 64;
} else {
enc4 = byte3 & 63;
}
}
outputStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4);
}
return outputStr;
}
</script>
<button onClick="send_with_ajax()">Get Image</button><br />
<img id="get_img" />
</body>
</html>
<body>
<script language="javascript" type="text/javascript">
function send_with_ajax ( ) {
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(exception) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
alert("Your browser does not support XMLHTTP Request...!");
}
xhr.open("GET", "300x300.gif", true); // Make sure file is in same server
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = function() {
if (xhr.readyState == 4){
if ((xhr.status == 200) || (xhr.status == 0)){
var image = document.getElementById("get_img");
image.src = "data:image/gif;base64," + encode64(xhr.responseText);
}else{
alert("Something misconfiguration : " +
"\nError Code : " + xhr.status +
"\nError Message : " + xhr.responseText);
}
}
};
xhr.send(null);
}
function encode64 (inputStr) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var outputStr = "";
var i = 0;
while (i> 2;
var enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);
var enc3, enc4;
if (isNaN(byte2)){
enc3 = enc4 = 64;
} else{
enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);
if (isNaN(byte3)){
enc4 = 64;
} else {
enc4 = byte3 & 63;
}
}
outputStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4);
}
return outputStr;
}
</script>
<button onClick="send_with_ajax()">Get Image</button><br />
<img id="get_img" />
</body>
</html>
Подписаться на:
Сообщения (Atom)