7

次のコード:

var mongo = require('mongodb');

var db = new mongo.Db('test', new mongo.Server('127.0.0.1', 27017, {}));

var callback = function (e, result) {
if (e) {
    console.log(e);
    process.exit(1);
}

console.log(result);
process.exit(0);
}

db.open(function (e) {
if (e)  callback(e);

db.collection('system.js', function (e, coll) {
    if (e)  callback(e);

    coll.save({
        "_id" : "myFunction",
        "value" : "function myFunction() { return 123; }"
    }, function (e) {
        if (e)  callback(e);

        db.eval("myFunction()", [], function (e, result) {
            if (e)  callback(e);

            callback(undefined, result);
        });

    });
});

});

出力:

[Error: eval failed: invoke failed: JS Error: TypeError: myFunction is not a function nofile_a:0]

問題は、関数定義をラップする引用符( "")に関連していることがわかりました。

mongo-cliの場合:

> db.system.js.find()
{ "_id" : "myFunction", "value" : "function myFunction() { return 123; }" }

しかし後:

> db.system.js.save({_id : "myFunction", value : function myFunction() { return 123; }});

> db.system.js.find()
{ "_id" : "myFunction", "value" : function cf__5__f_myFunction() {  
return 123;  
} }

db.eval( "myFunction()")は機能します!

だから、私の質問は:node-mongodb-nativeドライバーを使用してnode.jsからストアドプロシージャを保存するにはどうすればよいですか?

4

1 に答える 1

15

ドライバーのデータ型に関するドキュメントを読んだ後、コードとともに文字列を渡す代わりに、mongo.Codeオブジェクトを渡す必要があることに気付きました。

{
  "_id" : "myFunction",
  "value" : new mongo.Code("function myFunction() { return 123; }")
}
于 2012-04-18T14:22:16.927 に答える