Small Node.js proxy to turn a paginated JSON REST API into a CSV streaming download. Examples of code and patterns.
Presented at the London Node User Group meetup, April 2014
10. API -> CSV Stream
// pipe generated CSV onto the HTTP response
var writer = csv.createCsvStreamWriter(response)
// Turn a series of paginated requests
// to the backend API into a stream of data
var stream = apistream.instance(uri, token)
// Pipe data stream into CSV writer
stream.pipe(writer)
11. API -> CSV Stream
response.setHeader('Content-Type', ‘text/csv');
response.setHeader('Content-disposition', 'attachment;filename=' + name + '.csv');
14. API -> mappers -> CSV Stream
var writer = csv.createCsvStreamWriter(res);
var stream = apistream.instance(uri, token)
var mapper = new OrdersMapper()
// First line in CSV is the headers
writer.writeRecord(mapper.headers())
// mapper.eachRow() turns a single API resource into 1 or more CSV rows
stream.on('item', function (item) {
mapper.eachRow(item, function (row) {
writer.writeRecord(row)
})
})
15. API -> mappers -> CSV Stream
stream.on('item', function (item) {
mapper.eachRow(item, function (row) {
writer.writeRecord(row)
})
})
17. Paremeter definitions
var OrdersParams = params.define(function () {
this
.param('sort', 'updated_on:desc')
.param('per_page', 20)
.param('status', 'closed,pending,invalid,shipped')
})
18. Paremeter definitions
var params = new OrdersParams(request.query)
// Compose API url using sanitized / defaulted params
var uri = "https://api.com/orders?" + params.query;
var stream = apistream.instance(uri, token)
27. Node: validate JWT
var now = new Date(),
utc = getUtcCurrentDate();
if(utc - Number(decoded.iat) > TTL) {
res.send(401, "Web token has expired")
return
}