javascript - 如何在处理 HTTP 请求之前将 csv 文件同步加载到内存中

标签 javascript node.js csv express asynchronous

我正在尝试编写一个简单的 express/node.js 应用程序,它使用在 csv 文件中找到的数据来响应 GET 请求。我想读取此 csv 文件以生成一个 javascript 对象(本质上是一个键值映射),然后使生成的映射可用于 Controller 中的 HTTP 请求处理逻辑。

我写了一个模块来读取 csv 文件并导出所需的对象,但我不确定如何确保:

  1. 此操作完成并且对象在处理 HTTP 请求之前实际存在
  2. 文件操作仅在服务器启动时执行一次,而不是每个请求执行一次,从而产生大量开销

我如何组织我的代码以在 Express 应用的上下文中实现这些目标?

这是我处理 CSV 文件的方式:

var myMap = {};

fs.createReadStream('filename.csv')  
  .pipe(csv())
  .on('data', (row) => {
    // Build javascript object
    myMap[row['key']] = row['value'];
  })
  .on('end', () => {
    console.log('Done.');
  });

// Does this work?
module.exports =  myMap;

最佳答案

如何确保 http 对象在文件加载到内存后进行监听:


// server.js
var myMap = {};

function readCsv(cb){
  fs.createReadStream('filename.csv')  
  .pipe(csv())
  .on('data', (row) => {
    // Build javascript object
    myMap[row['key']] = row['value'];
  })
  .on('end', () => {
    console.log('Done.');
    cb();
  });
}

var app = express();

exports = Object.freeze({
  server: http.createServer(app)
  init(){
    readCsv(() => {
      this.server.listen(80)
    })
  }
})

类似的东西。

你也可以使用 Promise

// server.js
var myMap = {};

function readCsv(){
  return new Promise((resolve, reject) => {
    fs.createReadStream('filename.csv')  
    .pipe(csv())
    .on('data', (row) => {
      // Build javascript object
      myMap[row['key']] = row['value'];
    })
    .on('end', () => {
      console.log('Done.');
      resolve();
    })
    .on('error', reject)
  })

}

var app = express();

exports = Object.freeze({
  server: http.createServer(app)
  init(){
    return readCsv().then(() => {
      this.server.listen(80)
    })
  }
})

关于javascript - 如何在处理 HTTP 请求之前将 csv 文件同步加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55390770/

相关文章:

javascript - 向 reducer 添加功能

javascript - 自动调整div

node.js - 如何修复 'Content Security Policy: The page’ s 设置阻止在 http ://localhost:8080/favicon. ico (“default-src” 处加载资源。'

node.js - Argon2 很难在 MacOS 上与 Angular 8 配合使用 : actually not working at all

java - 在java中读取具有可变数据类型的CSV

javascript - 当我向包装器添加动画时,为什么我的包装器会移出其位置?

javascript - 在谷歌地图信息窗口中嵌入推文

javascript - Node (ES6) : SyntaxError: Unexpected token {

tsql - 将多行转换为一行,并以逗号作为分隔符

java - opencsv,不能将值与“