0

式に基づいて関数から抜け出そうとしていますが、スコープに問題があります。コードの抜粋は次のとおりです。

function createService(dict, res) {
    // Ensure no duplicate
    var serviceExists = Service.find({name: dict['name']}).count().exec(function(err, doc) {
        return (doc !== 0);
    });

    console.log(serviceExists);

    if(serviceExists){
        res.send(500, "Duplicate document. Try updating existing entry or chooseing a different name");
        return;
    }

    //Insert the document
    service = new Service(dict);
    service.save(function(err) {
        if(!err) {
            res.send("Service saved");
        }
    });
}

console.log()の出力:

{ emitted: {},
  _events: { err: [Function], complete: [Function] } }

ここでの最終目標は、doc!== 0の場合、コードが「ドキュメントの挿入」の部分に到達しないことです。これを行う正しい方法を教えてください(おそらく例外を使用しますか?それが私が残した唯一のアイデアです)。ありがとう

4

1 に答える 1

1

Service.find非同期です。のコールバックはexecすぐには実行されません。これにより、問題1が発生します(Service....exec(...)値が返された場合console.log、コールバックの前にすでに実行されているはずです。)

問題2もかなり一般的です。returninexec()は、変数に割り当てることができる値を返しません。(exec()無名関数の戻り値は返しません。)

コードの修正は次のとおりです。

function createService(dict, res) {
    // Ensure no duplicate
    Service.findOne({name: dict['name']}).count().exec(function(err, doc) {
        var serviceExists = (doc !== 0);
        console.log(serviceExists);
        if(serviceExists){
            res.send(500, "Duplicate document. Try updating existing entry or chooseing a different name");
            return;
        }

        //Insert the document
        service = new Service(dict);
        service.save(function(err) {
            if(!err) {
                res.send("Service saved");
            }
        });
    });
}

また、に変更findしましたfindOne。そうしないと、ドキュメントの代わりに配列が取得されます。

于 2012-08-06T22:54:21.393 に答える