Тема 4. NODE.JS HTTP-service: XmlServer.js + XmlServer.coffee
JavaScript
Cloud9 - https://c9.io/
Nitrous - https://www.nitrous.io/
runnable.com - http://runnable.com/new/Node.js
(node XmlServer.js »/dev/null 2»2.log &) &
Coding Ground - http://www.tutorialspoint.com/execute_nodejs_online.php
Online CoffeeScript Interpretator http://larryng.github.io/coffeescript-repl/
nodejsXMLServer: http://awsedunet.sytes.net:9000
groovyXMLServer: http://awsedunet.sytes.net:8000
var mysql = require('mysql');
var sql = 'SELECT * from svod_code where type=\'d\' order by code;';
if(process.argv.length===3) if(process.argv[2]!=='') sql = process.argv[2];
var connection = mysql.createConnection({
host: 'ec2-54-208-78-75.compute-1.amazonaws.com',
user: 'userairs',
password: 'userairs',
database : 'airs'
});
connection.connect();
connection.query(sql,
function(err, rows, fields) {
if (err) throw err;
console.log(JSON.stringify(rows));
}
);
connection.end();
------
node airstest.js "select 1 one"
[{"one":1}]
var http = require('http');
var open = require('open');
var url = require("url");
var server = http.createServer(function (request, response) {
var pathname = decodeURIComponent(url.parse(request.url).pathname);
console.log("Request for '" + pathname + "' received.");
response.writeHead(200, {"Content-Type": "text/html; charset=UTF-8"});
if(pathname==='/kill/'){
console.log("Server killed.");
response.end("<h1>Server killed<h1>");
request.connection.destroy();
process.exit();
}
response.write('<div style="font-size:24">');
response.write("<h1>"+pathname+"</h1>");
response.write("<hr><a href='/kill/'>Kill server</a>");
response.write('</div>');
response.end();
});
server.listen(9000);
console.log("Server running at http://127.0.0.1:9000/");
open('http://127.0.0.1:9000/'+ 'Hello World');
//var vm = require('vm');
var fs = require('fs');
var path = require('path');
var dir = path.dirname(require.main.filename)+'\\json';
var files = fs.readdirSync(dir);
for (var js in files)
console.log(files[js]);
/*
fs.readFile('./airstest.js', function(e, data) {
if (e) {throw e;}
var context= {require:require, console:console, process:process};
//process.argv[2] = "select * from svod_code limit 1;";
console.log('\n./airstest.js "' + process.argv[2] + '"');
process.stdout.write = function(d){process.stderr.write(d)};
vm.runInNewContext(data.toString(), context);
});
*/
process.stdout.write = function(d){process.stderr.write('+++'+d+'+++')};
require('./airstest.js');
delete require.cache[require.resolve('./airstest.js')];
------
node run-airstest.js "select 2 two"
airstest.json.js
airstest.json.plus.js
+++[{"two":2}]
+++
call c:\opt\node\nodejs.bat XmlServer.js
:restart
cls
call c:\opt\node\nodejs.bat XmlServer.js restart
goto restart
CoffeeScript
@SET NODE_PATH=%~dp0node_modules
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\coffee-script\bin\coffee" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\coffee-script\bin\coffee" %*
)
module.exports = new (require 'events').EventEmitter #!!!!!!!!!!!!!!!!!!!!!!
mysql = require 'mysql'
sql = 'SELECT * from svod_code where type=\'d\' order by code limit 7;'
if process.argv.length==3
if process.argv[2]!='' then sql = process.argv[2]
connection = mysql.createConnection
host: 'ec2-54-208-78-75.compute-1.amazonaws.com'
user: 'userairs'
password: 'userairs'
database : 'airs'
connection.connect
connection.query sql,
(err, rows)->
if err
console.log """{"error": "#{err}"}"""
else
console.log JSON.stringify rows
module.exports.emit '</ROWSET>' #!!!!!!!!!!!!!!!!!!!!!!
connection.end()
------
coffee airstest.json.coffee "select * from dx limit 1"
[{"serv":1,"tstamp":"200910061341","code":"0BL01U601XL70","value":"0","vf":"0","hand":"0","a_ext":"введена"}]
module.exports = new (require 'events').EventEmitter #!!!!!!!!!!!!!!!!!!!!!!
mysql = require 'mysql'
fs= require 'fs'
versionOf = fs.statSync(process.argv[1]).mtime.toISOString()[..9]
sql = 'SELECT * from svod_code where type=\'d\' order by code limit 100;'
if process.argv.length==3
if process.argv[2]!='' then sql = process.argv[2]
connection = mysql.createConnection
host: 'ec2-54-208-78-75.compute-1.amazonaws.com'
user: 'userairs'
password: 'userairs'
database : 'airs'
console.log """<?xml version='1.0' encoding='UTF-8'?>
<ROWSET autor='is10-99' versionOf='#{versionOf}'>
<!-- #{process.argv[1]}
?#{sql}
-->"""
connection.connect
connection.query sql, (err, rows, fields)->
connection.end ''
if err
console.log "<error> <![CDATA[#{err}]]></error>"
else
for row in rows
console.log "<ROW>"
for fild in fields
console.log "<#{fild.name}><![CDATA[#{row[fild.name]}]]></#{fild.name}>"
console.log "</ROW>"
console.log "</ROWSET>"
module.exports.emit '</ROWSET>' #!!!!!!!!!!!!!!!!!!!!!!
------
coffee airstest.xml.coffee "select * from dx limit 2"
<?xml version='1.0' encoding='UTF-8'?>
<ROWSET autor='is10-99' versionOf='2015-03-27'>
<!-- R:\DROPBOX\edunet\2014\is10-99\coffee\xml\airstest.xml.coffee
?select * from dx limit 2
-->
<ROW>
<serv><![CDATA[1]]></serv>
<tstamp><![CDATA[200910061341]]></tstamp>
<code><![CDATA[0BL01U601XL70]]></code>
<value><![CDATA[0]]></value>
<vf><![CDATA[0]]></vf>
<hand><![CDATA[0]]></hand>
<a_ext><![CDATA[введена]]></a_ext>
</ROW>
<ROW>
<serv><![CDATA[1]]></serv>
<tstamp><![CDATA[200910061341]]></tstamp>
<code><![CDATA[0BL01U602XL70]]></code>
<value><![CDATA[0]]></value>
<vf><![CDATA[0]]></vf>
<hand><![CDATA[0]]></hand>
<a_ext><![CDATA[введена]]></a_ext>
</ROW>
</ROWSET>
http = require "http"
open = require "open"
url = require "url"
scriptname = process.argv[1]
server = http.createServer (request, response)->
pathname = decodeURIComponent (url.parse request.url).pathname
search = decodeURIComponent (url.parse request.url,true).search
if not search then search = ''
console.log "Request for '#{pathname}#{search}' received."
response.writeHead 200, "Content-Type": "text/html; charset=UTF-8"
if pathname =='/kill/'
response.end "<h1>кирдык '#{scriptname}'</h1>"
server.close ''
request.connection.destroy ''
console.log "кирдык '#{scriptname}'"
process.exit ''
return
response.end """<div style='font-size:20'>
<h2>#{scriptname}: echo & suicide server</h2>
<h2>#{pathname}#{search}</h2>
<hr><a href='/kill/''>Kill server</a>
</div>"""
.listen 9002
console.log "#{scriptname} running at http://127.0.0.1:9002/"
open 'http://127.0.0.1:9002/Hello World?Вася&Петя'
coffee_file = './airstest.json.coffee'
process.stdout.write = (d)->
process.stderr.write '+++'+d+'+++'
require coffee_file
delete require.cache[require.resolve coffee_file]
------
coffee run-airstest.json.coffee "select 1 one"
+++[{"one":1}]
+++
#!/bin/bash
##(./coffeeXmlServer.sh >>./1.log 2>>./2.log &) &
coffee ./XmlServer.coffee
while true; do
clear
coffee ./XmlServer.coffee restart
done
Эскизы к binlog.coffee:
coffee> request = "pCode=2RH31S101XG01&pStart=200910061523&pStop=201103281305"
'pCode=2RH31S101XG01&pStart=200910061523&pStop=201103281305'
coffee> map = {}
{}
coffee> for q in request.split '&' then v = q.split '=' ; map[v[0]]=v[1]
[ '2RH31S101XG01',
'200910061523',
'201103281305' ]
coffee> map
{ pCode: '2RH31S101XG01',
pStart: '200910061523',
pStop: '201103281305' }
sql1 = "select name, nserv from svod_code where code='#{pCode}';"
pStart = map['pStart']
tStart = pStart.replace /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5"
versionOf = fs.statSync(process.argv[1]).mtime.toISOString()[..9]
async = require "async"
fnc1 = [
(cb) -> cb null, 1
(cb) -> cb null, 2, 2
(cb) -> cb null, 3, 4, 5
]
fnc2 = {
one: (cb) -> cb null, 1
two: (cb) -> cb "error2", 2, 3
three: (cb) -> cb null, 3, 4, 5
}
async.parallel fnc1,
(error, results)->
if error then console.error error
console.log results
async.parallel fnc2,
(error, results)->
if error then console.error error
console.log results
>>>>>>>>>>>>>>>>>>>>>>>>
coffee async-test-1.coffee
[ 1, [ 2, 2 ], [ 3, 4, 5 ] ]
error2
{ one: 1, two: [ 2, 3 ] }
async = require 'async'
...
async.parallel {
stat: (cb)-> fs.stat process.argv[1],
(err, stats) -> cb err, stats.mtime.toISOString()[..9]
sql1: (cb)-> connection.query sql1,
(err, rows, fields)-> cb err, rows
sql2: (cb)-> connection.query sql2,
(err, rows, fields)-> cb err, rows, fields
},
(error,res)->
...
rows1 = res['sql1']
rows2 = res['sql2'][0]
fields = res['sql2'][1]
...
<ROWSET autor='is10-99' versionOf='#{res['stat']}'>
...
...