Javascript 比较布尔值
目前,我有一个mongo数据库,可以跟踪用户提交的答案。当用户输入他们已经做过的答案时,即是是或否,我想检查答案是否已更改。问题是这只占了一半的时间 下面是一个名为Questions service的sails服务,当用户向node.js服务器发送答案时,Questions Controller会调用该服务 QuestionServer.jsJavascript 比较布尔值,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
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
});
});
}
};