目前,我有一个 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/