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