首页 文章

使用async.queue从CSV流中插入MongoDB文档时,“对象不是函数”错误

提问于
浏览
0

我正在尝试使用async.queue从CSV流中插入MongoDB文档 . 但我面临以下错误 . 我已经尝试过类似SO帖子中提供的所有补救措施 .

确切的错误消息是:

C:\ Users \ admin \ node_modules \ mongodb \ lib \ mongo_client.js:406 throw err TypeError:object不是C:\ Users \ admin \ Desktop \ mynodefile.js中的函数:13:2在C:\ Users \ admin \ node_modules \ mongodb \ lib \ mongo_client.js:403:11 at process._tickCallback(node.js:355:11)

我使用的node.js代码:

var csv = require('csv');
var async = require('async');
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017', function(err, db) {
if (err) throw err;

var collection = db.collection('myCSVs');
var queue = async.queue(collection.insert.bind(collection), 5);

csv()
.from.path('./input.csv', { columns: true })
.transform(function (data, index, cb) {
    queue.push(data, function (err, res) {
        if (err) return cb(err);
        cb(null, res[0]);
    });
})
.on('error', function (err) {
    console.log('ERROR: ' + err.message);
})
.on('end', function () {
    queue.drain = function() {
        collection.count(function(err, count) {
            console.log('Number of documents:', count);
            db.close();
        });
    };
});
});

2 回答

  • 0

    您尚未在 MongoClient.connect 函数调用中提及数据库名称 . 你可以这样做:

    MongoClient.connect('mongodb://localhost:27017/database_name',function(err, db) {
    

    然后你可以这样做:

    var collection = db.collection('myCSVs');
    

    如果myCSVs是database_name中的集合

    或者您也可以这样做:

    MongoClient.connect('mongodb://localhost:27017',function(err, mongoclient) {
        var db = mongoclient.db('database_name');
        var collection = db.collection('myCSVs');
    });
    
  • 0

    你必须改变

    var queue = async.queue(collection.insert.bind(collection), 5);
    

    成:

    var q = async.queue(function (task, callback) {
        console.log('hello ' + task.name);
        callback();
    }, 2);
    

    在这一行:

    queue.push(data, function (err, res) {
            if (err) return cb(err);
            cb(null, res[0]);
        });
    

    你用数据和回调调用push,但它没有在你的实现中实现

    var queue = async.queue(collection.insert.bind(collection), 5);
    

相关问题