Статьи

Другой Узел Эксперимент: AndKittens

Итак, я знаю, что говорил это раньше, но мне нравится создавать совершенно бесполезные, но забавные игрушки. Честно говоря, если бы я позволил практичности быть моим гидом, я, вероятно, никогда ничего не построю, и я не уверен, как я смогу учиться. Пожалуйста, имейте это в виду, когда читаете следующее. Я построил то, что следует, в качестве предлога, чтобы больше практиковать свои отбивные в Узле, чтобы не приносить что-то действительно стоящее в Интернет. Если вы не любите котят. Если так, это эпично.

Примерно неделю назад я видел твит от Кристиана Хайльмана о новом сайте SynthCats . Как вы, наверное, догадались, это сайт, наполненный изображениями кошек с клавиатурами и синтезаторами. Будучи непримиримым ребенком 80-х и новой волны, я действительно мог зайти на такой сайт. Это заставило меня задуматься; Вы могли бы взять любую комбинацию кошек и создать интересный сайт.

Из этого возникла идея AndKittens . Я представил себе сайт, на котором вы можете просто ввести URL, например, pugs.andkittens.us и увидеть коллекцию фотографий мопсов с котятами.

Строительство этого потребовало нескольких разных частей. Первой была поддержка домена с подстановочными знаками и самоанализ этого домена изнутри Node. На самом деле это было довольно тривиально, и на прошлой неделе я кратко описал это в своем блоге: Node.js Quickie: Проверка текущего доменного имени .

Используя этот код в качестве отправной точки, я просто анализирую поддомен и загружаю одно из двух представлений:

function getSubdomain(h) {
  var parts = h.split(".");
	if(parts.length == 2) return "www";
	return parts[0];
}

exports.index = function(req, res) {
	var subdomain = getSubdomain(req.headers.host);
	if(subdomain === 'www') {
		res.render('index');
	} else {
		res.render('viewer',{title:subdomain + ' and Kittens'});
	}
};

Вторым аспектом была поддержка динамического поиска изображений. Google вполне подходит для этого, но у них нет API для службы поиска. Вместо этого я обратился к Microsoft и их Bing Search API . Из-за этого было немного сложно зарегистрироваться, и их документы было немного сложно проанализировать (документы Word, правда? Я вообще не против Word, но я ожидаю, что мои документы API будут веб-страницами!), Но как только я прошел Первоначальная установка была довольно тривиальной, чтобы позвонить с узла.

Я написал быструю библиотеку оболочки. На самом деле, я бы не стал называть это библиотекой, поскольку она ориентирована только на поиск изображений, но ее можно было бы сделать более обобщенной, если бы люди захотели взять ее и запустить. Вот код

var https = require('https');
var qs = require('querystring');

BingSearch = function(key) {
  this.key = key;
}

BingSearch.prototype.search = function(s,cb) {
	
	var result = {success:false};
	console.log("Bing Search for "+s);
	var options = {
		hostname:"api.datamarket.azure.com",
		path:"/Bing/Search/Image?Query=%27" + qs.escape(s) + "%27&Adult=%27strict%27&$format=json",
		method:"GET",
		auth:":"+this.key,
		rejectUnauthorized:false
	}

	https.get(options, function(res) {
		console.log("Got response: " + res.statusCode);
		var body = "";
		
		res.on('data', function (chunk) {
			body += chunk;
		});
		
		res.on('end', function() {
			result.success = true;
			var data = JSON.parse(body);
			result.data = data.d.results;
			cb(result);
		});

	}).on('error', function(e) {
		console.log("Got error: " + e.message);
		cb(result);
	});

}

exports.BingSearch = BingSearch;

Две важные вещи здесь. Во-первых, Node.js выдает ошибку, если вы пытаетесь использовать сайт HTTPS с сертификатом, который он не распознает. Ему не понравился сертификат Microsoft, и, честно говоря, я не знаю почему. Я доверяю Microsoft, хотя. (Действительно.) Я использовал аргумент rejectUnauthorized, чтобы сказать Node.js, чтобы он верил, что я знал, что я делал, и просто нажал на проклятый API. (Мне бы очень хотелось, чтобы ColdFusion позволил это сделать!) Второе, что нужно помнить, это то, что Microsoft любит использовать прописные буквы в своих аргументах. Если вы не соответствуете точно, то вы получите ошибку. Странно, что они не соответствуют друг другу. Обратите внимание на часть $ format = json в конце.

По моему мнению, если нет какой-то важной причины производительности, глупо требовать точного соответствия случая аргументам.

В любом случае, вы поняли идею. Это конец. Передний конец сделал мой приятель Тай. Tai — это умное печенье, которое я знаю много лет, но, как ни странно, у него нет блога или веб-сайта, поэтому он не получает от меня ссылку здесь. Он разработал аспект «просмотра» сайта и сделал хороший переход от одного изображения к другому. Прямо сейчас есть небольшая ошибка в том, что если ошибка не загружается, мы не сразу перейдем к следующему изображению (и сбросим его из набора результатов).

Если вы хотите увидеть код, посмотрите репозиторий GitHub здесь: https://github.com/cfjedimaster/AndKittens . Да, я понимаю, что мой ключ Bing там. Мне нужно избавиться от этого, и я, вероятно, до конца месяца максимально использую свой бесплатный ключ. Такое случается.

Вот и все. Завтра я собираюсь поговорить о хостинге, который я использовал, Modulus .