Node.js 使用Express接收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

在提问之前,我想做一个简短的介绍

下面的示例非常适合将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: 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
    }))
})