2017-04-23 131 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都为“老更改答案”回归真实的,但似乎是发生的是,每当recordAnswer是false submitAnswerCheck始终返回true。

最后这里是保存布尔到MongoDB的模型:

QuestionsAnswered.js

module.exports = { 

attributes: { 

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

我不知道如果我错过理解布尔元和布尔对象,或者之间的区别在我的模型中设置布尔值时还有其他东西缺失。在比较javascript/sails.js中的布尔值时是否有其他人遇到过这个问题?

回答

0

发现问题

1日关闭,因为这article介绍如何使用布尔函数是非常危险的,因为它原来的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 
     }); 
    }); 
} 
};