【问题标题】:Javascript Comparing BooleansJavascript比较布尔值
【发布时间】:2017-04-23 11:08:22
【问题描述】:

目前,我有一个 mongo 数据库来跟踪用户提交的答案。当用户输入他们已经做过的答案时,即是或否,我想检查答案是否已更改。问题是这只工作了一半。

下面我有一个名为 Questions Service 的 Sails 服务,当用户向 node.js 服务器发送答案时,它会从 Questions Controller 调用。

问题服务器.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 函数中的代码中看到的那样,我想确保传递给该函数的布尔值始终是基元,而不是布尔对象。

您将在下面找到发送到服务器的所有控制台日志的输出。

关于以下输出的附加说明,将 != 更改为 !== 不会更改控制台的输出。下面的答案还是一样的。

输出到控制台:

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。

最后这里是将布尔值保存到 mongodb 的模型:

QuestionsAnswered.js

module.exports = {

attributes: {

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

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

【问题讨论】:

    标签: javascript node.js mongodb sails.js postman


    【解决方案1】:

    发现问题

    第一关,article 解释说使用布尔函数是非常危险的,因为事实证明 JavaScript 在类型强制方面非常激进。这意味着您不能依靠布尔函数将变量转换为基元。

    由此我发现 Postman 将我的答案布尔值作为字符串示例发送:

    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
            });
        });
    }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      相关资源
      最近更新 更多