我正在尝试编写一个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文档中提供的示例,但我无法确定我在这里做错了什么。
答案 0 :(得分:1)
我明白我做错了什么。记录被插入;我只是不明白mongo shell。此外,节点进程将保持打开状态,直到调用db.close()。现在我只需要知道在完成所有回调后我如何调用它:/