thanks for the response -- I looked as xlsx-writer, but it's not what I need. I don't needed to build the xlsx data -- that's what the API is sending me -- I just need to pass it back to the client without garbling it.
Robert On Friday, August 15, 2014 11:58:30 AM UTC-4, [email protected] wrote: > > not sure I understand the question correctly but if the file itself is > corrupt try using try something like > https://github.com/rubenv/node-xlsx-writer to build the xlsx from jason, > I use express framework (or koa) so I download with something simple like > (sorry for coffeescript) > > ...get "/blabladownload", (req,res) -> > > .... > > fs.exists 'blabla.txt', (exists) -> > if exists > res.download __dirname + '/blabla.txt', (err) -> # doesn't care > about file type > throw err if err > if err > console.log 'error download eShopDownLoad ',err.stack > res.send 'Error download eShopDownLoad: '+ err.code > > else > fs.unlink __dirname + '/blabla.txt',(err,data) -> > if err > console.log 'error unlink eShopDownLoad ',err.stack > res.send 'Error download eShopDownLoad: '+ err.code > else > do more stuff > > seems to work. Hope it helps. K > > El jueves, 14 de agosto de 2014 15:57:57 UTC+2, Robert Crooks escribió: >> >> I have a proxy for several APIs (it handles OAuth authentication for the >> call) built with simple node.js and request. It just returns all the >> headers and response body from the API call to the client. One of the apis >> has an option to return xlsx data instead of JSON. When I return that >> response to the client, an xlsx file does get downloaded, but it's >> corrupted somehow, and can't be opened by Excel (or any other spreadsheet >> app). I think it's some kind of encoding mismatch, but can't figure out how >> to fix it. Any help appreciated. (I am a node.js newbie by the way.) Here's >> the proxy code, and I think it's in sendRequest() function that something's >> going wrong: >> >> var BCLSPROXY = (function () { >> "use strict"; >> var util = require("util"), >> colors = require("colors"), >> http = require("http"), >> request = require("request"), >> aapiToken, >> pmapiToken, >> aapiExpires = 0, >> pmapiExpires = 0, >> aapiServer, >> pmapiServer, >> apiServer, // for other APIs >> // functions >> getFormValues, >> getAAPIAccessToken, >> getPMAPIAccessToken, >> getAccessToken, >> sendRequest; >> /* >> * extract form values from request body >> */ >> getFormValues = function (body, callback) { >> // split the request body string into an array >> var valuesArray = body.split("&"), >> options = {}, >> max = valuesArray.length, >> i, >> item, >> error = null; >> // initialize options to null except requestType to GET >> options.url = null; >> options.client_id = null; >> options.client_secret = null; >> options.requestBody = null; >> options.requestType = "GET"; >> // now split each item into key and value and store in the >> object >> for (i = 0; i < max; i = i + 1) { >> item = valuesArray[i].split("="); >> options[item[0]] = item[1]; >> } >> // data fixes >> // decode the URL >> options.url = decodeURIComponent(options.url); >> // check for required values >> if (options.client_id === null || options.client_secret === >> null || options.url === null) { >> error = "Error: client_id, client_secret, and url for API >> request are required!"; >> } >> if (error === null) { >> callback(null, options); >> } else { >> callback(error); >> } >> }; >> /* >> * get new Analytics API access_token >> */ >> getAAPIAccessToken = function (options, callback) { >> // base64 encode the ciient_id:client_secret string for basic >> auth >> var auth_string = new Buffer(options.client_id + ":" + >> options.client_secret).toString("base64"), >> bodyObj, >> now = new Date().valueOf(); >> if (aapiExpires < now) { >> request({ >> method: 'POST', >> url: 'https://oauth.brightcove.com/v3/access_token', >> headers: { >> "Authorization": "Basic " + auth_string, >> "Content-Type": >> "application/x-www-form-urlencoded" >> }, >> body: 'grant_type=client_credentials' >> }, function (error, response, body) { >> // check for errors >> if (error === null) { >> // return the access token to the callback >> bodyObj = JSON.parse(body); >> aapiToken = bodyObj.access_token; >> aapiExpires = now + (bodyObj.expires_in * 1000); >> callback(null, aapiToken); >> } else { >> callback(error); >> } >> }); >> } else { >> callback(null, aapiToken); >> } >> }; >> /* >> * get new Player Management API access_token >> */ >> getPMAPIAccessToken = function (options, callback) { >> // base64 encode the ciient_id:client_secret string for basic >> auth >> var auth_string = new Buffer(options.client_id + ":" + >> options.client_secret).toString("base64"), >> bodyObj, >> now = new Date().valueOf(); >> if (pmapiExpires < now) { >> request({ >> method: 'POST', >> url: 'https://oauth.brightcove.com/v3/access_token', >> headers: { >> "Authorization": "Basic " + auth_string, >> "Content-Type": >> "application/x-www-form-urlencoded" >> }, >> body: 'grant_type=client_credentials' >> }, function (error, response, body) { >> // check for errors >> if (error === null) { >> // return the access token to the callback >> bodyObj = JSON.parse(body); >> pmapiToken = bodyObj.access_token; >> pmapiExpires = now + (bodyObj.expires_in * 1000); >> callback(null, pmapiToken); >> } else { >> callback(error); >> } >> }); >> } else { >> callback(null, pmapiToken); >> } >> }; >> /* >> * get new access_token for other APIs >> */ >> getAccessToken = function (options, callback) { >> // base64 encode the ciient_id:client_secret string for basic >> auth >> var auth_string = new Buffer(options.client_id + ":" + >> options.client_secret).toString("base64"), >> bodyObj; >> // don't know what API was requested, always get new token >> request({ >> method: 'POST', >> url: 'https://oauth.brightcove.com/v3/access_token', >> headers: { >> "Authorization": "Basic " + auth_string, >> "Content-Type": "application/x-www-form-urlencoded" >> }, >> body: 'grant_type=client_credentials' >> }, function (error, response, body) { >> // check for errors >> if (error === null) { >> // return the access token to the callback >> bodyObj = JSON.parse(body); >> callback(null, bodyObj.access_token); >> } else { >> callback(error); >> } >> }); >> }; >> /* >> * sends the request to the targeted API >> */ >> sendRequest = function (token, options, callback) { >> var requestOptions = { >> method: options.requestType, >> url: options.url, >> headers: { >> "Authorization": "Bearer " + token, >> "Content-Type": "application/json" >> }, >> body: options.requestBody >> }; >> request(requestOptions, function (error, response, body) { >> console.log("error", error); >> if (error === null) { >> callback(null, response.headers, body); >> } else { >> callback(error); >> } >> }); >> }; >> /* >> * sends the request to the Analytics API (special case) >> */ >> sendRequest = function (token, options, callback) { >> var requestOptions = { >> method: options.requestType, >> url: options.url, >> headers: { >> "Authorization": "Bearer " + token, >> "Content-Type": "application/json" >> }, >> body: options.requestBody >> }; >> request(requestOptions, function (error, response, body) { >> console.log("error", error); >> if (error === null) { >> callback(null, response.headers, body); >> } else { >> callback(error); >> } >> }); >> }; >> /* >> * Http Server to handle Analytics API requests >> */ >> aapiServer = http.createServer(function (req, res) { >> var body = ""; >> /* the published version of this proxy accepts requests only >> from >> * domains that include "brightcove.com" >> * modify the following line to take requests from >> * other domains or remove the if block to >> * accept requests from any domain (not recommended!) >> */ >> if (req.headers.origin.indexOf("brightcove.com") < 0) { >> res.writeHead(500); >> res.end("Your request cannot be processed; this proxy >> only handles requests originating from Brightcove servers. If you would >> like to build your own version of this proxy, see >> http://docs.brightcove.com/en/perform/oauth-api/guides/quick-start.html >> "); >> } >> req.on("data", function (chunk) { >> body += chunk; >> }); >> req.on("end", function () { >> getFormValues(body, function (error, options) { >> if (error === null) { >> getAAPIAccessToken(options, function (error, >> token) { >> if (error === null) { >> sendRequest(token, options, function >> (error, headers, body) { >> if (error === null) { >> console.log("headers", headers); >> var header; >> for (header in headers) { >> res.setHeader(header, >> headers[header]); >> } >> if (body.indexOf("{") === 0 || >> options.url.indexOf("format=json") > -1) { >> // prettify JSON >> body = >> JSON.stringify(JSON.parse(body), true, 2); >> } >> res.writeHead(200); >> res.end(body); >> } else { >> res.writeHead(500); >> res.end("Your API call was >> unsuccessful; here is what the server returned: " + error); >> } >> }); >> } else { >> res.writeHead(500); >> res.end("There was a problem getting your >> access token: " + error); >> } >> }); >> } else { >> res.writeHead(500); >> res.end("There was a problem with your request: " >> + error); >> } >> }); >> }); >> // change the following line to have the proxy listen for >> requests on a different port >> }).listen(8002); >> /* >> * Http Server to handle Player Management API requests >> */ >> pmapiServer = http.createServer(function (req, res) { >> var body = ""; >> // the published version of this proxy accepts requests only >> from domains that include "brightcove.com" >> // modify the following line to take requests from other >> domains >> // or remove the if block to accept requests from any domain >> (not recommended!) >> if (req.headers.origin.indexOf("brightcove.com") < 0) { >> res.writeHead(500); >> res.end("Your request cannot be processed; this proxy >> only handles requests originating from Brightcove servers. If you would >> like to build your own version of this proxy, see >> http://docs.brightcove.com/en/perform/oauth-api/guides/quick-start.html >> "); >> } >> req.on("data", function (chunk) { >> body += chunk; >> }); >> req.on("end", function () { >> getFormValues(body, function (error, options) { >> if (error === null) { >> getPMAPIAccessToken(options, function (error, >> token) { >> if (error === null) { >> sendRequest(token, options, function >> (error, headers, body) { >> if (error === null) { >> console.log("headers", headers); >> var header; >> for (header in headers) { >> res.setHeader(header, >> headers[header]); >> } >> if (body.indexOf("{") === 0 || >> options.url.indexOf("format=json") > -1) { >> // prettify JSON >> body = >> JSON.stringify(JSON.parse(body), true, 2); >> & >> ... > > -- Job board: http://jobs.nodejs.org/ New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/b1a11b09-c882-4584-92d5-a92fc0c50a81%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
