Node.js 使用Express接收JSON数据块并插入到PostgreSQL中
在提问之前,我想做一个简短的介绍 下面的示例非常适合将400MB JSON文件作为流读取并将数据附加到PostgreSQL数据库中Node.js 使用Express接收JSON数据块并插入到PostgreSQL中,node.js,express,file-upload,stream,Node.js,Express,File Upload,Stream,在提问之前,我想做一个简短的介绍 下面的示例非常适合将400MB JSON文件作为流读取并将数据附加到PostgreSQL数据库中 var fs = require('fs') var JSONStream = require('JSONStream') var es = require('event-stream') var Pool = require('pg').Pool var pool = new Pool({user: user, host: host, database: dat
var fs = require('fs')
var JSONStream = require('JSONStream')
var es = require('event-stream')
var Pool = require('pg').Pool
var pool = new Pool({user: user, host: host, database: database, password: password, port: port})
var types = require('pg').types
types.setTypeParser(1114, str => str)
var getStream = function () {
var jsond = 'export.json', //400MB File
stream = fs.createReadStream(jsond, {encoding: 'utf8'}),
parser = JSONStream.parse('*');
return stream.pipe(parser);
};
var i = 0
getStream().pipe(es.mapSync(function (d){
pool.query(`INSERT INTO metrics ("id","test") values ($1,$2)`,[d.id,d.test]).catch(console.error).then(function(){
console.log('Inserted...', i++)
})
}));
我使用下面的代码使用express和express fileupload从上传表单获取JSON文件。它也可以完美地工作(我使用了通常的标题):
server.js
index.html
我建议你用这个。它允许您将二进制数据直接流到表中或从表中流出。这正是你需要的。以下是一个来自NPM页面的示例:
从文件到表的管道
var fs=require('fs');
var{Pool}=require('pg');
var copyFrom=require('pg-copy-streams')。from;
var pool=新池();
连接(函数(错误、客户端、完成){
var stream=client.query(copyFrom('COPY my_table FROM STDIN');
var fileStream=fs.createReadStream('some_file.tsv'))
fileStream.on('error',done);
stream.on('error',done);
流。在('end',done');
管道(流);
});
app.post('/upload', function(req, res, next){
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No file');
}
let sampleFile = req.files.archive;
sampleFile.mv(`${pathtoupload}}/upload.js`, function(err) {
if (err) return res.status(500).send(err);
res.send('File uploaded!');
})
})
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-12 col-sm-12">
<form method="POST" encType="multipart/form-data">
<input type="file" name="archive" />
<button type="submit" class="btn btn-success btn-lg"><i class="material-icons">cloud_upload</i> Send</button>
</form>
</div>
</div>
</div>
</div>
<script>
$("form").submit(function(e){
e.preventDefault()
var formData = new FormData(this)
$.ajax({
url: '/upload',
type: 'POST',
data: formData,
//dataType: 'application/octet-stream',
cache: false,
contentType: false,
processData: false,
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener('progress', function(a) {
console.log('P',a)
}, false);
}
return myXhr;
},
success: function(data) {
alert('ok',data)
},
});
});
</script>
var JSONStream = require('JSONStream')
var es = require('event-stream')
var stream = require('stream');
app.post('/upload', function(req, res){
console.log('upload')
var readable = new stream.Readable({encoding: 'utf8'})
req.on('data', function onRequestData(chunk){
readable.push(chunk)
})
req.on('end', function(){
res.send({})
})
var getStream = function () {
parser = JSONStream.parse('*')
return readable.pipe(parser)
}
getStream().pipe(es.mapSync(function(d){
console.log(d)
///the pg insert part
}))
})