1

基本的に、データを挿入する前に特定のデータがデータベースに存在するかどうかを確認したいので(ネイティブmongodbドライバーを使用)、collection.findOne()属性のプロパティがnullの場合、データが存在するかどうかを確認するために使用しましたcollection.insert()

どうやら私のコードはロジックに従って機能していません、誰かが私を教えてください!

私のコードのいくつか:

exports.addUser = function(req, res) {
    var twitterId = req.body.provider;
    var userEmail = req.body.email;

    db.collection('users', function(err, collection) {
        collection.findOne({'email':userEmail }, function(err, item){

            if(item.email === null){

                collection.insert({
                    'email': userEmail,
                    'provider': {
                        'twitter': {
                            'id': twitterId
                        }
                    }
                }, function(err, result) {
                    if (err) {
                        res.send({'error':'An error has occurred'});
                    } else {
                        console.log('Success: ' + JSON.stringify(result[0]));
                        res.send(result[0]);
                    }
                });   

            }else{
                console.log("Email exits ");
            }
        });


    });
}
4

1 に答える 1

1

ステートメントは、明示的にに設定されることをif期待しています。がのプロパティでない場合、そのifステートメントはに評価されます。item.emailnullitem.emailitemfalse

var foo = {bar:'baz'}
foo.bar // 'baz'
foo.notSet // undefined
foo.notSet === undefined // true
foo.notSet === null // false

// now if we set foo.notSet to undefined...
foo.notSet = null // undefined
foo.notSet === null // true

だから、いくつかのオプションがあります...

if (item.email) {} else {};
if ('email' in item) {} else {};
if (item.hasOwnProperty('email')) {} else {};

オブジェクト自体に存在しないプロパティを呼び出そうとすると、JSはそのプロトタイプをチェックし、プロトタイプのどこにも存在しない場合は、未定義を返します。

演算子は、左側のinオペランドが右側のオブジェクトのプロパティであるかどうかを確認します。

最後Object.hasOwnPropertyに、オブジェクトのプロパティとしての引数をチェックします。

言うまでもなく、{upsert:true}おそらくあなたの最善の策でしょう。

于 2013-01-22T00:39:01.057 に答える