Pro jQuery

Pro jQuery

Адам Фриман

Обновление скрипта Node.js

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

Листинг 16-2: Обновленный скрипт Node.js
var http = require('http');
var url = require('url');
var querystring = require('querystring');
http.createServer(function (req, res) {
	console.log("Request: " + req.method + " to " + req.url);
	if (req.method == 'OPTIONS') {
		res.writeHead(200, "OK", {
			"Access-Control-Allow-Headers": "Content-Type",
			"Access-Control-Allow-Methods": "*",
			"Access-Control-Allow-Origin": "*"
		});
		res.end();
	} else if (req.method == 'POST') {
		var dataObj = new Object();
		var contentType = req.headers["content-type"];
		var fullBody = '';
		if (contentType) {
			if (contentType.indexOf("application/x-www-form-urlencoded") > -1) {
				req.on('data', function (chunk) { fullBody += chunk.toString(); });
				req.on('end', function () {
					var dBody = querystring.parse(fullBody);
					writeResponse(req, res, dBody,
					url.parse(req.url, true).query["callback"])
				});
			} else {
				req.on('data', function (chunk) { fullBody += chunk.toString(); });
				req.on('end', function () {
					dataObj = JSON.parse(fullBody);
					var dprops = new Object();
					for (var i = 0; i < dataObj.length; i++) {
						dprops[dataObj[i].name] = dataObj[i].value;
					}
					writeResponse(req, res, dprops);
				});
			}
		}
	} else if (req.method == "GET") {
		var data = url.parse(req.url, true).query;
		writeResponse(req, res, data, data["callback"])
	}
}).listen(80);
console.log("Ready on port 80");
var flowerData = {
	astor: { price: 2.99, stock: 10, plural: "Astors" },
	daffodil: { price: 1.99, stock: 10, plural: "Daffodils" },
	rose: { price: 4.99, stock: 2, plural: "Roses" },
	peony: { price: 1.50, stock: 3, plural: "Peonies" },
	primula: { price: 3.12, stock: 20, plural: "Primulas" },
	snowdrop: { price: 0.99, stock: 5, plural: "Snowdrops" },
	carnation: { price: 0.50, stock: 1, plural: "Carnations" },
	lily: { price: 1.20, stock: 2, plural: "Lillies" },
	orchid: { price: 10.99, stock: 5, plural: "Orchids" }
}
function writeResponse(req, res, data, jsonp) {
	var jsonData;
	if (req.url == "/stockcheck") {
		for (flower in data) {
			if (flowerData[flower].stock >= data[flower]) {
				jsonData = true;
			} else {
				jsonData = "We only have " + flowerData[flower].stock + " "
				+ flowerData[flower].plural + " in stock";
			}
			break;
		}
		jsonData = JSON.stringify(jsonData);
	} else {
		var totalCount = 0;
		var totalPrice = 0;
		for (item in data) {
			if (item != "_" && data[item] > 0) {
				var itemNum = Number(data[item])
				totalCount += itemNum;
				totalPrice += (itemNum * flowerData[item].price);
			} else {
				delete data[item];
			}
		}
		data.totalItems = totalCount;
		data.totalPrice = totalPrice.toFixed(2);
		jsonData = JSON.stringify(data);
		if (jsonp) {
			jsonData = jsonp + "(" + jsonData + ")";
		}
	}
	res.writeHead(200, "OK", {
		"Content-Type": jsonp ? "text/javascript" : "application/json",
		"Access-Control-Allow-Origin": "*"
	});
	res.write(jsonData);
	res.end();
}

Ответ браузеру сейчас включает в себя итоговые цены для элементов, выбранных при помощи элементов form и отправленных на сервер, и возвращает JSON:

{"astor":"1","daffodil":"2","rose":"4","totalItems":7,"totalPrice":"26.93"}

Я сохранил этот скрипт в файл с именем formserver.js. Самый просто способ получить этот скрипт – это скачать исходный код, который сопровождает данную книгу и который находится в свободном доступе на Apress.com. Для запуска данного скрипта я ввожу следующее в командную строку:

node.exe formserver.js
или RSS канал: Что новенького на smarly.net