我正在尝试编写一个简单的express / node.js应用程序,该应用程序使用csv文件中的数据来响应GET请求.我想阅读此csv文件以生成javascript对象(本质上是键-值映射),然后使生成的映射可用于控制器中的HTTP请求处理逻辑.
我编写了一个读取csv文件并导出所需对象的模块,但不确定如何确保:
>该操作完成,并且对象在处理HTTP请求之前实际存在
>文件操作仅在服务器启动时执行一次,而不是每个请求一次执行,从而导致大量开销
这就是我处理CSV文件的方式:
@H_403_15@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对象进行侦听:
@H_403_15@ // server.js var myMap = {}; function readCsv(cb){ fs.createReadStream('filename.csv') .pipe(csv()) .on('data',() => { console.log('Done.'); cb(); }); } var app = express(); exports = Object.freeze({ server: http.createServer(app) init(){ readCsv(() => { this.server.listen(80) }) } })
这样的事情.
您还可以利用Promise
@H_403_15@// server.js var myMap = {}; function readCsv(){ return new Promise((request,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) }) } })