为何三元表达式始终返回1?like参数为false仍不符合预期
问题:GET接口中三元表达式处理复选框参数不符合预期
我是编程新手,在项目的GET接口里使用三元表达式处理复选框参数时遇到异常:不管复选框是否勾选,like ? 1 : 0始终返回1。明明console.log(like)显示未勾选时是false,勾选时是true,但接口返回的likes字段一直是1。我已经注释掉其他代码排除干扰,项目其余模板代码无问题。
接口代码
'use strict'; const mongoose = require("mongoose"); const stockModel = require("../models.js").Stock; async function getPrice(stock) { const response = await fetch(`https://stock-price-checker-proxy.freecodecamp.rocks/v1/stock/${stock}/quote`, { method: 'GET', credentials: 'same-origin' }); const { symbol, latestPrice } = await response.json(); return { symbol, latestPrice }; } module.exports = function (app) { app.route('/api/stock-prices') .get(async function (req, res) { // 获取响应所需的所有参数 const { stock, like } = req.query; const { symbol, latestPrice } = await getPrice(stock); // 如果找不到股票 if(!symbol) { ////// console.log(like); res.json({ stockData: { error: "invalid symbol", likes: like ? 1 : 0 }}); ////// console.log(like); return; } }); };
前端表单代码
<form id="testForm2" class="border"> <input type="text" name="stock" placeholder="GOOG" required="" /> <input type="checkbox" name="like" value="true" /> Like? <br /> <button type="submit">Get Price!</button> </form>
数据库模型代码
const mongoose = require("mongoose"); const { Schema } = mongoose; const stockSchema = new Schema({ symbol: { type: String, required: true }, likes: { type: [String], default: [] } }); const Stock = mongoose.model('Stock', stockSchema); exports.Stock = Stock;
数据库连接代码
const mongoose = require("mongoose"); const db = mongoose.connect(process.env.MONGO_URI); module.exports = db;
问题原因
核心问题是GET请求的query参数类型与预期不符:
- 表单提交复选框时,勾选状态下会发送
like=true,此时req.query.like是字符串"true",而非布尔值true; - 未勾选时,表单不会提交该参数,
req.query.like应为undefined,若框架做了特殊处理,可能会被设为字符串"false"。
这两种情况里,字符串"true"和"false"在布尔判断中都是truthy值(非空字符串均为真),所以like ? 1 : 0始终返回1。
解决方案
需要严格判断like的实际值,而非依赖隐式布尔转换:
方案1:严格匹配字符串值
res.json({ stockData: { error: "invalid symbol", likes: like === 'true' ? 1 : 0 }});
方案2:兼容多种可能的取值
如果存在框架自动转换布尔值的情况,可以同时兼容字符串和布尔值:
const isLiked = like === 'true' || like === true; res.json({ stockData: { error: "invalid symbol", likes: isLiked ? 1 : 0 }});
验证方法
可以在代码中添加一行打印,确认like的类型和实际值:
console.log('like的值:', like, '类型:', typeof like);
内容的提问来源于stack exchange,提问作者Luis Costantin
相关产品推荐
相关产品推荐

