You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何三元表达式始终返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:15:16