为什么我的Node.js / Mongodb程序挂在insertOne()上?

时间:2015-06-10 05:45:20

标签: node.js mongodb

我正在尝试编写一个Node.js应用程序,该应用程序以递归方式读取MP3和FLAC文件的目录,并将其元数据和文件路径作为文档插入Mongodb集合中。这是列表:

/**
 * File: import/import.js
 * Desc: A program that reads and imports media files into mongodb
 */

"use strict"

var assert = require("assert")
  , dir = require("node-dir")
  , fs = require("fs")
  , mm = require("musicmetadata")
  , mongodb = require("mongodb")
  , parseArgs = require("minimist")
  , path = require("path")

//////////
// Main //
//////////

var argv = parseArgs( process.argv.slice(2)
                    , { "boolean": [ "d", "debug" ] }
                    )

var debug = argv["d"] !== false || argv["debug"] !== false
if (debug) console.log("Debug enabled.")

var url = "mongodb://localhost"
  , db
  , coll
mongodb.MongoClient.connect(url, function (err, database) {
  if (err) throw err
  if (debug) console.log("Connected to mongodb.")
  db = database
  coll = db.collection("coolname")
  main()
})

function main() {
  var dirArg = argv._.length >= 1
             ? argv._[0]
             : process.cwd()
  dirArg = path.resolve(process.cwd(), dirArg)

  if (debug) {
    coll.insertOne( { "foo": "bar" }, function (err, r) {
      assert.equal(null, err)
      assert.equal(1, r.insertedCount)
      console.log(r)
    })
  }

  if (debug) {
    console.log("Beginning recursive descent from " + dirArg)
  }

  dir.files(dirArg, handleFiles)
}

///////////////
// Functions //
///////////////

/**
 * Iterates through `files` and adds each MP3 and FLAC file
 * to a mongodb database.
 */
function handleFiles(err, files) {
  if (err) throw err
  files.forEach(function (file) {
    fs.lstat(file, function (err, stats) {
      if (err) throw err
      if (!stats.isFile()) return
      var ext = path.extname(file)
      if (ext === ".mp3" || ext === ".flac") handleMedia(file)
    })
  })
}

/**
 * Adds `file` to a mongodb instance.
 */
function handleMedia(file) {
  var parser = mm(fs.createReadStream(file), function (err, metadata) {
    if (err) throw err
    metadata.filepath = file
    if (debug) console.log(metadata)
    coll.insertOne(metadata, function (err, r) {
      assert.equal(null, err)
      assert.equal(1, r.insertedCount)
      if (debug) console.log("In callback")
    })
  })
}

我的程序似乎成功连接到我的Mongodb实例,我的日志记录显示我应该有几次成功调用insertOne(),但是我的程序最终挂在传递给该函数的回调中。另外,由于这些回调没有错误,并且传递的WriteOpResult对象每次报告insertedCount为1,我希望找到一些记录插入到我的集合中,但查询集合每次都不会产生任何结果。

我试图应用Mongodb文档中提供的示例,但我无法确定我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

我明白我做错了什么。记录被插入;我只是不明白mongo shell。此外,节点进程将保持打开状态,直到调用db.close()。现在我只需要知道在完成所有回调后我如何调用它:/