2017-04-23 5 views
1

現在、ユーザーが投稿した回答を追跡するmongoデータベースがあります。ユーザーがすでに入力した回答を入力すると、それは「はい」または「いいえ」です。答えが変わったかどうかを確認したいのですが、問題は、これが時間の半分しか働いていないことです。Javascriptブーリアンを比較する

以下に、ユーザーがnode.jsサーバーに回答を送信するときに質問コントローラから呼び出される質問サービスと呼ばれるセールサービスがあります。

QuestionServer.js

var ObjectID = require('mongodb').ObjectID; 

module.exports = { 

submitAnswer: function(tokenKey, questionId, answer, done) { 

    User.findOne({tokenKey: tokenKey}).exec(function (err, findOneRecord){ 
     if(findOneRecord) { 
      var qId = ObjectID(questionId); 
      QuestionsAnswered.findOrCreate({question: qId, user: findOneRecord.id}).exec(function createFindCB(error, createdOrFoundRecord){ 
       if(error) { 
        done(error, findOneRecord, null); 
       }else if(createdOrFoundRecord){ 
        var oldAnswerChanged = QuestionService.submitAnswerCheck(createdOrFoundRecord.answer, answer); 
        console.log("Old Changed Answer = " + oldAnswerChanged); 

        createdOrFoundRecord.answer = answer; 
        createdOrFoundRecord.save(function(saveErr) { 
         QuestionService.submitCount(questionId, answer, oldAnswerChanged, done); 
        }); 
       } 
      }); 
     } 
    }); 
}, 

submitAnswerCheck: function(recordAnswer, answer) { 
    console.log("recordAnswer = " + recordAnswer); 
    console.log("answer = " + answer); 

    recordAnswer = Boolean(recordAnswer); 
    answer = Boolean(answer); 

    if(recordAnswer != answer){ 
     return true; 
    } 

    return false; 
} 
} 

あなたは私のsubmitAnswerCheck関数の上に自分のコードから見ることができるように私は、この関数に渡されるブール値は常にプリミティブと決してブールオブジェクトであることを確認します。

以下は、すべてのコンソールログの出力がサーバーに送られています。

以下の出力に関する追加の注記:!= to!==を変更してもコンソールからの出力は変更されません。以下の回答はまだ同じです。コンソールに

出力:

recordAnswer = true 
answer = true 
Old Changed Answer = false 

recordAnswer = true 
answer = false 
Old Changed Answer = false 

recordAnswer = false 
answer = false 
Old Changed Answer = true 

recordAnswer = false 
answer = true 
Old Changed Answer = true 

recordAnswer = true 
answer = true 
Old Changed Answer = false 

私が見たいのは何の出力例2と4は「オールド・変更回答」のためにtrueを返しますが、何が起こっているように見えることはrecordAnswerがある時はいつでもということです両方falseの場合、submitAnswerCheckは常にtrueを返します。私はブールプリミティブとブーリアンオブジェクトまたは場合との違いを理解し欠場していた場合

module.exports = { 

attributes: { 

question: { 
    model: "question", 
    required: true 
}, 
user: { 
    model: "user", 
    required: true 
}, 
answer: { 
    type: "boolean", 
    boolean: true 
} 
} 
}; 

私はわからない

QuestionsAnswered.js:

最後に、ここでは、MongoDBのためにブール値を保存しているモデルであり、私のモデルでブール値を設定するときに、私が見逃している何かがあります。他の人にjavascript/sails.jsのブール値を比較するときにこの問題が発生していますか?このarticleとしてオフ問題

が第一発見

答えて

0

は、型の強制についてかなり積極的ではJavaScriptが判明したので、ブール関数を使用すると、非常に危険である説明しています。つまり、変数をプリミティブに変換するためにブール関数でリレーすることはできません。以下に示すように

debug: answer = 'true' 

は、ソリューションは答えが「真」と等しいかどうかをチェックするのと同じくらい簡単だった:

正しい方法をこれから

私はポストマンは、文字列の例として、私の答えのブール値を送っていたことが判明しました(QuestionController.js):

module.exports = { 

answer: function(req, res) { 

    var tokenKey = req.param("tokenKey"); 
    var questionId = req.param("questionId"); 
    var answer = (req.param("answer") == 'true'); 

    QuestionService.submitAnswer(tokenKey, questionId, answer, function(err, yes, no){ 
     return res.json({ 
      countYes: yes, 
      countNo: no, 
      err: err 
     }); 
    }); 
} 
}; 

不正方法:

module.exports = { 

answer: function(req, res) { 

    var tokenKey = req.param("tokenKey"); 
    var questionId = req.param("questionId"); 
    var answer = req.param("answer"); 

    QuestionService.submitAnswer(tokenKey, questionId, answer, function(err, yes, no){ 
     return res.json({ 
      countYes: yes, 
      countNo: no, 
      err: err 
     }); 
    }); 
} 
};