首页 > 解决方案 > node.js 插入到 mongodb

问题描述

我正在尝试编写一个简单的程序,将犯罪列表存储到 mongodb 数据库中,但是在过去的几个小时里我尝试了很多解决方案,似乎 Node.js 只看到一个数据并且它是未定义的!是的,interventionscitoyendo.csv 文件不为空,并且位于 javascript 文件旁边。有任何想法吗?

var fs = require('fs');
var file = fs.createWriteStream('interventionscitoyendo.csv');
var http = require('http');
var iclite = require("iconv-lite");
var csv = require('csv');
var object = csv();
var db = null;
var request = http.get("http://donnees.ville.montreal.qc.ca/dataset/5829b5b0-ea6f-476f-be94-bc2b8797769a/resource/c6f482bf-bf0f-4960-8b2f-9982c211addd/download/interventionscitoyendo.csv", function(response) {
response.pipe(file);
});

//Create Data-Base
var mongo = require("mongodb").MongoClient;
var url = "mongodb://localhost:27017/";

mongo.connect(url,{ useNewUrlParser: true }, function(err, database) {
if (err){ console.log(err);}
db = database;
var dbo = db.db("Crimes");
var ListeCrimes = [];
object.from.path('interventionscitoyendo.csv').to.array(function (data) {
for (var index = 0; index < data.length; index++) {
  var crime = {
    CATEGORIE: iclite.decode(data[index][0], "ISO-8859-1"),
    DATE: data[index][1],
    QUART: data[index][2],
    PDQ: data[index][3],
    X: data[index][4],
    Y: data[index][5],
    LATITUDE: data[index][6],
    LONGITUDE: data[index][7]
  };
  console.log(crime);
  ListeCrimes.push(crime);
}
console.log(data.length);
dbo.collection("Crimes").insertMany(ListeCrimes, function(err, res) {
    if (err){ console.log(err);}
    else { console.log("A1 works"); }
});
if (data.status == 200){
  db.close();
}
});
});

输出是:

{ CATEGORIE: '',
DATE: undefined,
QUART: undefined,
PDQ: undefined,
X: undefined,
Y: undefined,
LATITUDE: undefined,
LONGITUDE: undefined }
1
A1 works

标签: node.jsmongodb

解决方案


'file' 没有完全写入,因为没有数据,它开始被读取。您应该等待完成事件引发。

file.on('finish', function() {
});

在此完成事件处理程序中,使用异步方法关闭文件:file.close。
当文件关闭时,您可以在 mongo db 中读取和插入。

file.on('finish', function() {
    file.close(function() {
        // Insert in mongoDB here
    });
});

等待文件完成管道后,解决方案应如下:

var fs = require('fs');
var file = fs.createWriteStream('interventionscitoyendo.csv');
var http = require('http');
var iclite = require("iconv-lite");
var csv = require('csv');
var object = csv();
var db = null;
var request = http.get("http://donnees.ville.montreal.qc.ca/dataset/5829b5b0-ea6f-476f-be94-bc2b8797769a/resource/c6f482bf-bf0f-4960-8b2f-9982c211addd/download/interventionscitoyendo.csv", function(response) {
    response.pipe(file);
});

file.on('finish', function() {
    file.close(function() {
      // Create Data-Base
      var mongo = require("mongodb").MongoClient;
      var url = "mongodb://localhost:27017/";

      mongo.connect(url,{ useNewUrlParser: true }, function(err, database) {
          if (err){ console.log(err);}
          db = database;
          var dbo = db.db("Crimes");
          var ListeCrimes = [];
          object.from.path('./interventionscitoyendo.csv').to.array(function (data) {
              for (var index = 0; index < data.length; index++) {
                  var crime = {
                      CATEGORIE: iclite.decode(data[index][0], "ISO-8859-1"),
                      DATE: data[index][1],
                      QUART: data[index][2],
                      PDQ: data[index][3],
                      X: data[index][4],
                      Y: data[index][5],
                      LATITUDE: data[index][6],
                      LONGITUDE: data[index][7]
                  };
                  console.log(crime);
                  ListeCrimes.push(crime);
              }
              console.log(data.length);
              dbo.collection("Crimes").insertMany(ListeCrimes, function(err, res) {
                  if (err){ console.log(err);}
                  else { console.log("A1 works"); }
              });
              if (data.status == 200){
                  db.close();
              }
          });
      });
    });
});

推荐阅读