【发布时间】:2018-12-22 09:43:06
【问题描述】:
我确信这从根本上是对流如何工作的误解,但我是在碰壁。
我有一些 json 格式的传感器数据,我想使用 csv-write-stream 包附加到 csv 文件中。数据作为发布请求发送到节点服务器,目的是将其附加到 csv 文件中。它第一次很好地将一行写入 csv 文件,但是如果我尝试发送另一个发布请求,则会收到“错误:结束后写入”错误。
function write_csv(obj) {
writer.pipe(fs.createWriteStream('tides.csv', { flags: 'a' }));
writer.write(obj);
writer.end();
};
如果我注释掉“writer.end()”它可以正常工作,但这最终不会引发内存错误吗?如果是这样,追加到 csv 文件并避免此错误的正确方法是什么?
编辑:这是整个 server.js 文件
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const exphbs = require('express-handlebars');
const fs = require('fs');
const csvWriter = require('csv-write-stream');
const writer = csvWriter({ sendHeaders: false });
const app = express();
app.set('views', path.join(__dirname, 'views'));
app.engine('handlebars', exphbs({ defaultLayout: 'main' }));
app.set('view engine', 'handlebars');
app.set('port', (process.env.PORT || 3000));
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.get('/', function (req, res) {
res.render('home')
})
app.post('/test', function (req, res, next) {
// console.log("post received");
distance = req.body.distance;
let result = test(distance);
let result_str = JSON.stringify(result);
res.end(result_str)
});
function write_csv(obj) {
writer.pipe(fs.createWriteStream('out.csv', { flags: 'a' }));
writer.write(obj);
writer.end();
};
function test(dist) {
let d = new Date();
let YYYY = d.getFullYear();
let MM = d.getMonth();
let DD = d.getDate();
let HH = d.getHours();
let mm = d.getMinutes();
let ss = d.getSeconds();
let date = YYYY + ':' + (MM + 1) + ':' + DD + ':' + HH + ':' + mm + ':' + ss;
let time_distance = { 'time': date, 'distance': distance };
console.log(time_distance);
write_csv(time_distance);
return time_distance;
};
app.listen(app.get('port'), function () {
console.log('Sever started on port ' + app.get('port'));
})
【问题讨论】:
-
writer.write(obj);在返回之前不会等待写入完成...所以write.end()会立即执行,而不是在写入完成后执行 -
试试
function write_csv(obj) { writer.pipe(fs.createWriteStream('tides.csv', { flags: 'a' })); writer.write(obj, () =>writer.end()); }; -
@JaromandaX 这不是真正的问题,因为
.write每次调用时都不会写入磁盘,它只会在达到highWaterMark阈值或.end时才会这样做叫。所以writer.write(); writer.end();很好。 -
哦,好的,所以问题不存在:p
标签: javascript node.js