Обновление скрипта 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