Javascript 比较布尔值

Javascript 比较布尔值,javascript,node.js,mongodb,sails.js,postman,Javascript,Node.js,Mongodb,Sails.js,Postman,目前,我有一个mongo数据库,可以跟踪用户提交的答案。当用户输入他们已经做过的答案时,即是是或否,我想检查答案是否已更改。问题是这只占了一半的时间 下面是一个名为Questions service的sails服务,当用户向node.js服务器发送答案时,Questions Controller会调用该服务 QuestionServer.js var ObjectID = require('mongodb').ObjectID; module.exports = { submitAnswer

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

下面是一个名为Questions service的sails服务,当用户向node.js服务器发送答案时,Questions Controller会调用该服务

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函数中从上面的代码中看到的,我希望确保传递给该函数的布尔值始终是原语,而不是布尔对象

在下面,您将看到所有控制台日志输出到服务器

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

输出到控制台:

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的模型:

问题sanswered.js

module.exports = {

attributes: {

question: {
    model: "question",
    required: true
},
user: {
    model: "user",
    required: true
},
answer: {
    type: "boolean",
    boolean: true
} 
}
};
我不确定我是否没有理解布尔基元和布尔对象之间的区别,或者在我的模型中设置布尔时是否缺少其他东西。其他人在比较javascript/sails.js中的布尔值时是否遇到过这个问题?

发现了这个问题

首先,正如本文所解释的,使用布尔函数是非常危险的,因为事实证明JavaScript在类型强制方面非常激进。这意味着您不能依靠布尔函数将变量转换为原语

从中我发现邮递员将我的答案布尔值作为字符串发送,例如:

debug: answer = 'true'
解决方案非常简单,只需检查答案是否等于“true”,如下所示:

正确的方法(QuestionController.js):

不正确的方式:

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
        });
    });
}
};
发现问题

首先,正如本文所解释的,使用布尔函数是非常危险的,因为事实证明JavaScript在类型强制方面非常激进。这意味着您不能依靠布尔函数将变量转换为原语

从中我发现邮递员将我的答案布尔值作为字符串发送,例如:

debug: answer = 'true'
解决方案非常简单,只需检查答案是否等于“true”,如下所示:

正确的方法(QuestionController.js):

不正确的方式:

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