我正在尝试编写一个简单的express / node.js应用程序,该应用程序使用csv文件中的数据来响应GET请求.我想阅读此csv文件以生成javascript对象(本质上是键-值映射),然后使生成的映射可用于控制器中的HTTP请求处理逻辑.
我编写了一个读取csv文件并导出所需对象的模块,但不确定如何确保:
>该操作完成,并且对象在处理HTTP请求之前实际存在
>文件操作仅在服务器启动时执行一次,而不是每个请求一次执行,从而导致大量开销
这就是我处理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',() => {
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((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)
})
}
})