Javascript 比较 bool 值

标签 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: 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 函数中的代码中看到的,我想确保传递给此函数的 bool 值始终是基元,而不是 bool 对象。

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

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

输出到控制台:

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。

最后这是将 bool 值保存到 mongodb 的模型:

QuestionsAnswered.js

module.exports = {

attributes: {

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

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

最佳答案

发现问题

第一关是这样的 article解释说使用 bool 函数非常危险,因为事实证明 JavaScript 对于类型强制非常激进。这意味着您无法依赖 bool 函数将变量转换为基元。

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

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") == '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
        });
    });
}
};

关于Javascript 比较 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570368/

相关文章:

javascript - GA 事件跟踪嵌入式表单小部件

node.js - 咕噜声的问题

python - 如何使用 PyMongo 在 MongoDB 中创建新数据库?

mongodb - Mongo导入数据类型

javascript - 启动mongodb和express的正确方法?

javascript - d3 和弦 : center text on circle

javascript - 根据另一个选择值选择选择

node.js - 如何: Execute infinite scroll using AngularJS and change route on every new post

python - 如何使用 NodeJS 在单个 HTTP POST 中发送文件和 JSON 数据(元数据)

javascript - Revenuecat React-Native 产品获得空对象?