在Node.js中使用js-xlsx进行非阻塞读取

时间:2017-10-30 15:35:41

标签: node.js

我正在使用js-xlsx来读取Node.js服务器中的Excel文件。该文件使用多部分表单数据发布,并存储在临时位置。但是,当我正在读取文件时,看起来我的Node.js线程被阻止,无法提供其他请求。在下面的代码中,如果我在/ read的调用挂起时调用/,则调用/ stalls直到读取完成。

    const express = require('express');
    var XLSX    = require('xlsx');

    const app = express()

    app.get('/', function (req, res) {
      res.send('Hello World!')
    })

    app.get('/read', function (req, res) {
      console.log("Starting file read ...");
      var workbook = XLSX.readFile("/tmp/myfile.xlsx")
      console.log("Done file read ...");
      res.send('File Read')
    })

    app.get('/readwithtimeout', function (req, res) {
      console.log("Starting file read ...");
      setTimeout(function() {
        var workbook = XLSX.readFile("/tmp/myfile.xlsx")
        console.log("Done file read ...");
      }, 0);
      res.send('File Read')
    })

    app.listen(3000, function () {
      console.log('Example app listening on port 3000!')
    })

这是读取Excel文件并解析它的正确方法吗?或者我应该做别的事吗?

1 个答案:

答案 0 :(得分:0)

根据他们的文档:https://github.com/SheetJS/js-xlsx/tree/master/demos/server

  

readFile / writeFile函数包装fs。{read,write} FileSync:

......这很烦人。看起来您可以使用{ "jcr:primaryType": "cq:Page", "jcr:createdBy": "admin", "jcr:created": "Fri Nov 03 2017 13:56:12 GMT+0000", "jcr:content": { "jcr:primaryType": "cq:PageContent", "jcr:createdBy": "admin", "jcr:title": "Parent page", "cq:template": "/apps/myproject/templates/common-page", "isRootPage": true, "jcr:created": "Fri Nov 03 2017 13:56:12 GMT+0000", "cq:lastModified": "Fri Nov 03 2017 13:56:12 GMT+0000", "sling:resourceType": "myproject/components/page", "cq:lastModifiedBy": "admin" } } 代替,这样您就可以使用XLSX.read()的异步版本,例如:

fs.readFile()

我不确定如果xls解析也很慢并且同步,它是否有帮助,但至少读取的文件将是异步的。