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

bsh*_*ets 8 javascript csv asynchronous node.js express

我正在尝试编写一个简单的 express/node.js 应用程序,该应用程序使用 csv 文件中的数据响应 GET 请求。我想读取这个 csv 文件来生成一个 javascript 对象(本质上是一个键值映射),然后使生成的映射可用于控制器中的 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;
Run Code Online (Sandbox Code Playgroud)

dan*_*jee 7

如何确保 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)
    })
  }
})

Run Code Online (Sandbox Code Playgroud)

类似的东西。

您还可以使用 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)
    })
  }
})

Run Code Online (Sandbox Code Playgroud)

  • 最后我明白了如何使用自定义 Promise 来处理异步代码。谢谢你! (2认同)