forked from sheetjs/docs.sheetjs.com
		
	express
This commit is contained in:
		
							parent
							
								
									08b7493c34
								
							
						
					
					
						commit
						4b4bf7ff54
					
				| @ -482,3 +482,37 @@ function SheetJSSuperAgentUL() { | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## NodeJS Demos | ||||
| 
 | ||||
| This demo focuses on a number of strategies. Some of these demos were written | ||||
| before NodeJS added `fetch`. | ||||
| 
 | ||||
| ### request | ||||
| 
 | ||||
| :::warning | ||||
| 
 | ||||
| `request` has been deprecated and should only be used in legacy deployments. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| Setting the option `encoding: null` passes raw buffers: | ||||
| 
 | ||||
| ```js | ||||
| var XLSX = require('xlsx'), request = require('request'); | ||||
| var url = 'https://sheetjs.com/pres.numbers'; | ||||
| 
 | ||||
| /* call `request` with the option `encoding: null` */ | ||||
| // highlight-next-line | ||||
| request(url, {encoding: null}, function(err, res, data) { | ||||
|   if(err || res.statusCode !== 200) return; | ||||
| 
 | ||||
|   /* if the request was succesful, parse the data */ | ||||
|   // highlight-next-line | ||||
|   var wb = XLSX.read(data); | ||||
| 
 | ||||
|   /* print the first worksheet to console */ | ||||
|   var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
|   console.log(XLSX.utils.sheet_to_csv(ws, {blankrows:false})); | ||||
| }); | ||||
| ``` | ||||
| @ -1,5 +1,5 @@ | ||||
| --- | ||||
| sidebar_position: 23 | ||||
| sidebar_position: 24 | ||||
| title: HTTP Server Processing | ||||
| --- | ||||
| 
 | ||||
| @ -65,7 +65,7 @@ require("http").createServer(function(req, res) { | ||||
| 
 | ||||
| ## Deno | ||||
| 
 | ||||
| :::warning | ||||
| :::caution | ||||
| 
 | ||||
| Many hosted services like Deno Deploy do not offer filesystem access. | ||||
| 
 | ||||
| @ -222,4 +222,196 @@ Click "Choose File" and select `pres.numbers`.  Then click "Submit" | ||||
| 
 | ||||
| The page should show the contents of the file as an HTML table. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## NodeJS | ||||
| 
 | ||||
| ### Express | ||||
| 
 | ||||
| The `express-formidable` middleware is powered by the `formidable` parser.  It | ||||
| adds a `files` property to the request. | ||||
| 
 | ||||
| When downloading binary data, Express handles `Buffer` data in `res.end`.  The | ||||
| convenience `attachment` method adds the required header: | ||||
| 
 | ||||
| ```js | ||||
| // Header 'Content-Disposition: attachment; filename="SheetJS.xlsx"' | ||||
| res.attachment("SheetJS.xlsx"); | ||||
| ``` | ||||
| 
 | ||||
| The following demo Express server will respond to POST requests to `/upload` | ||||
| with a CSV output of the first sheet.  It will also respond to GET requests to | ||||
| `/download`, responding with a fixed XLSX worksheet: | ||||
| 
 | ||||
| ```js title="SheetJSExpressCSV.js" | ||||
| var XLSX = require('xlsx'), express = require('express'); | ||||
| 
 | ||||
| /* create app */ | ||||
| var app = express(); | ||||
| /* add express-formidable middleware */ | ||||
| // highlight-next-line | ||||
| app.use(require('express-formidable')()); | ||||
| /* route for handling uploaded data */ | ||||
| app.post('/upload', function(req, res) { | ||||
|   // highlight-start | ||||
|   var f = req.files["upload"]; // <input type="file" id="upload" name="upload"> | ||||
|   var wb = XLSX.readFile(f.path); | ||||
|   // highlight-end | ||||
|   /* respond with CSV data from the first sheet */ | ||||
|   res.status(200).end(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])); | ||||
| }); | ||||
| app.get('/download', function(req, res) { | ||||
|   /* generate workbook object */ | ||||
|   var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split(""), [5,4,3,3,7,9,5]]); | ||||
|   var wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "Data"); | ||||
|   // highlight-start | ||||
|   /* generate buffer */ | ||||
|   var buf = XLSX.write(wb, {type: "buffer", bookType: "xlsx"}); | ||||
|   /* set headers */ | ||||
|   res.attachment("SheetJSExpress.xlsx"); | ||||
|   /* respond with file data */ | ||||
|   res.status(200).end(buf); | ||||
|   // highlight-end | ||||
| }); | ||||
| app.listen(+process.env.PORT||3000); | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Testing</b> (click to show)</summary> | ||||
| 
 | ||||
| 0) Save the code sample to `SheetJSExpressCSV.js` | ||||
| 
 | ||||
| 1) Install dependencies: | ||||
| 
 | ||||
| ```bash | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz express express-formidable | ||||
| ``` | ||||
| 
 | ||||
| 2) Start server (note: it will not print anything to console when running) | ||||
| 
 | ||||
| ```bash | ||||
| node SheetJSExpressCSV.js | ||||
| ``` | ||||
| 
 | ||||
| 3) Test POST requests using <https://sheetjs.com/pres.numbers>: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://sheetjs.com/pres.numbers | ||||
| curl -X POST -F upload=@pres.numbers http://localhost:3000/upload | ||||
| ``` | ||||
| 
 | ||||
| The response should show the data in CSV rows. | ||||
| 
 | ||||
| 4) Test GET requests by opening http://localhost:3000/download in your browser. | ||||
| 
 | ||||
| It should prompt to download `SheetJSExpress.xlsx` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ### NestJS | ||||
| 
 | ||||
| [The NestJS docs](https://docs.nestjs.com/techniques/file-upload) have detailed | ||||
| instructions for file upload support. In the controller, the `path` property | ||||
| works with `XLSX.readFile`. | ||||
| 
 | ||||
| When downloading binary data, NestJS expects `StreamableFile`-wrapped Buffers. | ||||
| 
 | ||||
| The following demo NestJS Controller will respond to POST requests to `/upload` | ||||
| with a CSV output of the first sheet.  It will also respond to GET requests to | ||||
| `/download`, responding with a fixed export: | ||||
| 
 | ||||
| ```ts title="src/sheetjs/sheetjs.controller.js" | ||||
| import { Controller, Get, Header, Post, StreamableFile, UploadedFile, UseInterceptors } from '@nestjs/common'; | ||||
| import { FileInterceptor } from '@nestjs/platform-express'; | ||||
| import { readFile, utils } from 'xlsx'; | ||||
| 
 | ||||
| @Controller('sheetjs') | ||||
| export class SheetjsController { | ||||
|   @Post('upload') //  <input type="file" id="upload" name="upload"> | ||||
|   @UseInterceptors(FileInterceptor('upload')) | ||||
|   async uploadXlsxFile(@UploadedFile() file: Express.Multer.File) { | ||||
|     /* file.path is a path to the workbook */ | ||||
|     // highlight-next-line | ||||
|     const wb = readFile(file.path); | ||||
|     /* generate CSV of first worksheet */ | ||||
|     return utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]); | ||||
|   } | ||||
| 
 | ||||
|   @Get('download') | ||||
|   @Header('Content-Disposition', 'attachment; filename="SheetJSNest.xlsx"') | ||||
|   async downloadXlsxFile(): Promise<StreamableFile> { | ||||
|     var ws = utils.aoa_to_sheet(["SheetJS".split(""), [5,4,3,3,7,9,5]]); | ||||
|     var wb = utils.book_new(); utils.book_append_sheet(wb, ws, "Data"); | ||||
|     // highlight-start | ||||
|     /* generate buffer */ | ||||
|     var buf = write(wb, {type: "buffer", bookType: "xlsx"}); | ||||
|     /* Return a streamable file */ | ||||
|     return new StreamableFile(buf); | ||||
|     // highlight-end | ||||
|   } | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Testing</b> (click to show)</summary> | ||||
| 
 | ||||
| 1) Create a new project: | ||||
| 
 | ||||
| ```bash | ||||
| npx @nestjs/cli new -p npm sheetjs-nest | ||||
| cd sheetjs-nest | ||||
| npm i --save https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz | ||||
| npm i --save-dev @types/multer | ||||
| mkdir -p upload | ||||
| ``` | ||||
| 
 | ||||
| 2) Create a new controller and a new module: | ||||
| 
 | ||||
| ```bash | ||||
| npx @nestjs/cli generate module sheetjs | ||||
| npx @nestjs/cli generate controller sheetjs | ||||
| ``` | ||||
| 
 | ||||
| 3) Add Multer to the new module by editing `src/sheetjs/sheetjs.module.ts`. | ||||
| Changes are highlighted below: | ||||
| 
 | ||||
| ```ts title="src/sheetjs/sheetjs.module.ts" | ||||
| import { Module } from '@nestjs/common'; | ||||
| import { SheetjsController } from './sheetjs.controller'; | ||||
| // highlight-next-line | ||||
| import { MulterModule } from '@nestjs/platform-express'; | ||||
| 
 | ||||
| @Module({ | ||||
| // highlight-start | ||||
|   imports: [ | ||||
|     MulterModule.register({ | ||||
|       dest: './upload', | ||||
|     }), | ||||
|   ], | ||||
| // highlight-end | ||||
|   controllers: [SheetjsController] | ||||
| }) | ||||
| export class SheetjsModule {} | ||||
| ``` | ||||
| 
 | ||||
| 4) Copy the `src/sheetjs/sheetjs.controller.ts` example from earlier, replacing | ||||
| the contents of the existing file. | ||||
| 
 | ||||
| 5) Start the server with | ||||
| 
 | ||||
| ```bash | ||||
| npx @nestjs/cli start | ||||
| ``` | ||||
| 
 | ||||
| 3) Test POST requests using <https://sheetjs.com/pres.numbers>: | ||||
| 
 | ||||
| ```bash | ||||
| curl -LO https://sheetjs.com/pres.numbers | ||||
| curl -X POST -F upload=@pres.numbers http://localhost:3000/sheetjs/upload | ||||
| ``` | ||||
| 
 | ||||
| The response should show the data in CSV rows. | ||||
| 
 | ||||
| 4) Test GET requests by opening http://localhost:3000/sheetjs/download in your browser. | ||||
| 
 | ||||
| It should prompt to download `SheetJSNest.xlsx` | ||||
| 
 | ||||
| </details> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user