Refresh server demos

- microjs demo removed
- hapi.js demo does not work in latest version
This commit is contained in:
AmishBaztard 2021-04-15 22:09:55 -04:00 committed by Kyle Aldridge
parent 1d7aff45c8
commit e958dbf18e
5 changed files with 59 additions and 109 deletions

View File

@ -1,6 +1,5 @@
.PHONY: init
init:
if [ ! -e sheetjs.xlsx ]; then ln -s ../../sheetjs.xlsx; fi
mkdir -p node_modules
cd node_modules; if [ ! -e xlsx ]; then ln -s ../../../ xlsx; fi; cd -
@ -12,10 +11,6 @@ request: init ## request demo
express: init ## express demo
node express.js
.PHONY: micro
micro: init ## micro demo
micro -p 7262 micro.js
.PHONY: koa
koa: init ## koa demo
node koa.js

View File

@ -8,6 +8,38 @@ demo shows a few different strategies applied to different server frameworks.
NOTE: these examples merely demonstrate the core concepts and do not include
appropriate error checking or other production-level features.
### Express Setup
The following commands are required in order to test the [Express](https://github.com/expressjs/express) demo:
```bash
npm install express printj xlsx express-formidable
node express.js
```
### Koa Setup
The following commands are required in order to test the [Koa](https://github.com/koajs/koa) demo:
```bash
npm install koa printj formidable xlsx
node koa.js
```
### Hapi Setup
**Note: Hapi demo as written only works with Hapi version 16 and below.**
The following commands are required in order to test the [Hapi](https://github.com/hapijs/hapi) demo:
```bash
npm install hapi@16.x printj tiny-worker xlsx
node hapi.js
```
### Node Buffer
The `read` and `write` functions can handle `Buffer` data with `type:"buffer"`.
@ -64,12 +96,12 @@ expected to handle:
Testing with cURL is straightforward:
```bash
# upload test.xls and update data
curl -X POST -F "data=@test.xls" http://localhost:7262/
# upload sheetjs.csv and update data
curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
# download data in SYLK format
curl -X GET http://localhost:7262/?t=slk
# read sheetjs.xlsx from the server directory
curl -X POST http://localhost:7262/?f=sheetjs.xlsx
# read sheetjs.csv from the server directory
curl -X POST http://localhost:7262/?f=sheetjs.csv
# write sheetjs.xlsb in the XLSB format
curl -X GET http://localhost:7262/?f=sheetjs.xlsb
```
@ -108,17 +140,6 @@ The main server script is `koa.js` and the worker script is `koasub.js`. State
is maintained in the worker script.
## command-line utility with micro
The npm module ships with the `xlsx` command line tool. For global installs, the
script `bin/xlsx.njs` is added to a directory in `PATH`. For local installs, the
appropriate script or symbolic link is set up in `node_modules/.bin/`.
The `--arrays` option directs `xlsx` to generate an array of arrays that can be
parsed by the server. To generate files, the `json2csv` module exports the JS
array of arrays to a CSV, the server writes the file, and the `xlsx` command is
used to generate files of different formats.
## tiny-worker with hapi
@ -132,12 +153,12 @@ Note: due to an issue with hapi payload parsing, the route `POST /file` is used
to handle the case of reading from file, so the cURL test is:
```bash
# upload test.xls and update data
curl -X POST -F "data=@test.xls" http://localhost:7262/
# upload sheetjs.csv and update data
curl -X POST -F "data=@sheetjs.csv" http://localhost:7262/
# download data in SYLK format
curl -X GET http://localhost:7262/?t=slk
# read sheetjs.xlsx from the server directory
curl -X POST http://localhost:7262/file?f=sheetjs.xlsx
# read sheetjs.csv from the server directory
curl -X POST http://localhost:7262/file?f=sheetjs.csv
# write sheetjs.xlsb in the XLSB format
curl -X GET http://localhost:7262/?f=sheetjs.xlsb
```

View File

@ -1,85 +0,0 @@
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
var fs = require('fs');
var URL = require('url');
var child_process = require('child_process');
var micro = require('micro'), formidable = require('formidable');
var logit = require('./_logit'), cors = require('./_cors');
var json2csv = require('json2csv');
var data = "a,b,c\n1,2,3".split("\n").map(function(x) { return x.split(","); });
var xlsx = '../../bin/xlsx.njs';
function get_data(req, res, type) {
var file = "_tmp." + type;
/* prepare CSV */
var csv = json2csv({data:data, hasCSVColumnTitle:false});
/* write it to a temp file */
fs.writeFile('tmp.csv', csv, function(err1) {
/* call xlsx to read the csv and write to another temp file */
child_process.exec(xlsx+' tmp.csv -o '+ file, function(err, stdout, stderr){
cors(req, res);
/* read the new file and send it to the client */
micro.send(res, 200, fs.readFileSync(file));
});
});
}
function get_file(req, res, file) {
var csv = json2csv({data:data, hasCSVColumnTitle:false});
fs.writeFile('tmp.csv', csv, function(err1) {
/* write to specified file */
child_process.exec(xlsx+' tmp.csv -o '+file, function(err, stdout, stderr) {
cors(req, res);
micro.send(res, 200, "wrote to " + file + "\n");
});
});
}
function post_data(req, res) {
var form = new formidable.IncomingForm();
form.on('file', function(field, file) {
/* file.path is the location of the file in the system */
child_process.exec(xlsx+' --arrays ' + file.path, post_cb(req, res));
});
form.parse(req);
}
function post_file(req, res, file) {
child_process.exec(xlsx+' --arrays ' + file, post_cb(req, res));
}
function post_cb(req, res) {
return function(err, stdout, stderr) {
cors(req, res);
/* xlsx --arrays writes JSON to stdout, so parse and assign to data var */
data = JSON.parse(stdout);
console.log(data);
return micro.send(res, 200, "ok\n");
};
}
function get(req, res) {
var url = URL.parse(req.url, true);
if(url.pathname.length > 1) micro.send(res, 404, "File not found");
else if(url.query.t) get_data(req, res, url.query.t);
else if(url.query.f) get_file(req, res, url.query.f);
else micro.send(res, 403, "Forbidden\n");
}
function post(req, res) {
var url = URL.parse(req.url, true);
if(url.pathname.length > 1) micro.send(res, 404, "File not found");
else if(url.query.f) post_file(req, res, url.query.f);
else post_data(req, res);
}
module.exports = function(req, res) {
logit(req, res);
switch(req.method) {
case 'GET': return get(req, res);
case 'POST': return post(req, res);
}
return micro.send(res, 501, "Unsupported method " + req.method + "\n");
};

19
demos/server/sheetjs.csv Normal file
View File

@ -0,0 +1,19 @@
Text,Number,Rich,Span
This is Bold,123,This is Bold,This is Bold
This is Italic,234,This is Italic,This is Italic
This is Underline,345,This is Underline,This is Underline
This is Stricken,456,This is Stricken,This is Stricken
This is 18 px,567,This is 18 px,This is 18 px
This is superscript,678,This is superscript,This is superscript
This is subscript,789,This is subscript,This is subscript
This is red,135,This is red,This is red
This is green,246,This is green,This is green
This is Times,357,This is Times,This is Times
This is BIU,159,This is 01324576 yes,This is BIU
BG Green,255,White on Blue,Green on Black
Standard Newline,W S,"BR
New line","Pre
New line"
Height,100,px (not pt),yeah
Top Left,80,Middle Center,Bottom Right
Top Right,60,Bottom Center,Bottom Left
1 Text Number Rich Span
2 This is Bold 123 This is Bold This is Bold
3 This is Italic 234 This is Italic This is Italic
4 This is Underline 345 This is Underline This is Underline
5 This is Stricken 456 This is Stricken This is Stricken
6 This is 18 px 567 This is 18 px This is 18 px
7 This is superscript 678 This is superscript This is superscript
8 This is subscript 789 This is subscript This is subscript
9 This is red 135 This is red This is red
10 This is green 246 This is green This is green
11 This is Times 357 This is Times This is Times
12 This is BIU 159 This is 01324576 yes This is BIU
13 BG Green 255 White on Blue Green on Black
14 Standard Newline W S BR New line Pre New line
15 Height 100 px (not pt) yeah
16 Top Left 80 Middle Center Bottom Right
17 Top Right 60 Bottom Center Bottom Left