由于缺少引号,布尔值未在 MERN 堆栈中更新

Posted

技术标签:

【中文标题】由于缺少引号,布尔值未在 MERN 堆栈中更新【英文标题】:Boolean Value is not getting updated in MERN stack due to lack of quotation marks 【发布时间】:2021-10-30 21:43:33 【问题描述】:

我正在使用 MERN 堆栈创建一个日志记录 Web 应用程序。所有功能都运行良好,只有一个问题:当我尝试更新日志时,所有内容都会更新(消息、技术员、日期),只是一个 BOOLEAN 实体(注意)没有更新。

我尝试了很多东西,在 postman 中,我开始意识到 - 消息、技术人员和日期是在 引号 内提交的(" message","tech_name","10/11/2001")。只是布尔实体 - 注意提交时不带引号 (true)。

这是正在转发到 API 的数据:

由于 attention 具有布尔数据类型,它只是 true 或 false,而不是 “true”或“false”

所以当我使用邮递员提交数据时,将引号添加到布尔值中,成功了!。我只是不知道如何在编码中使用 MERN。任何帮助,将不胜感激。这是邮递员中带引号和不带引号的提交图像。

不带引号提交::

带引号提交((当我将引号添加到 false 时更新) )::

我正在使用 MERN(Mongoose、Express、React 和 Node)。我在这里粘贴了一些相关代码。如果需要我的代码的任何其他部分,请发表评论。

//注意力的初始化

const [attention, setAttention] = useState(false);

//更新日志的方法

const updLog = 
 id: current._id,
 message,
 tech,
 attention,
 date: new Date(),
 ;
updateLog(updLog);

// 更新日志操作

export const updateLog = (log) => async (dispatch) => 
  try 
    setLoading();
    const res = await fetch(`/logs/$log.id`, 
      method: "PUT",
      body: JSON.stringify(log),
      headers: 
        "Content-Type": "application/json",
      ,
    );
    const data = await res.json();
    console.log(data);
    dispatch(
      type: UPDATE_LOG,
      payload: data,
    );

    clearCurrent();
   catch (err) 
    dispatch(
      type: LOGS_ERROR,
      payload: err.response.statusText,
    );
  
;

// 后端更新路由

router.put("/:_id", async (req, res) => 
  const  message, tech, attention, date  = req.body;

  const logFields = ;

  if (message) logFields.message = message;
  if (tech) logFields.tech = tech;
  if (attention) logFields.attention = attention;
  if (date) logFields.date = date;

  try 
    let log = await Logs.findById(req.params._id);

    if (!log) return res.status(404).json( msg: "Log Not Found" );

    log = await Logs.findByIdAndUpdate(
      req.params._id,
      
        $set: logFields,
      ,
      
        new: true,
      
    );

    res.json(log);
   catch (err) 
    console.error(err.message);
    res.status(500).send("Server Error");
  
);

(看看这个看看发生了什么:https://gifyu.com/image/GGi6)

【问题讨论】:

【参考方案1】:

您当然可以将客户端更改为始终将注意力字段作为字符串发送

const updLog = 
 id: current._id,
 message,
 tech,
 attention: attention ? "true" : "false",
 date: new Date(),
 ;
updateLog(updLog);

但您真正的问题在于以下行:

if (attention) logFields.attention = attention;

if (attention) 仅在设置了注意字段并且为 true 时才计算为 true - 如果您只想检查注意字段是 undefined 还是 null,请将变量与null 代替(当值未定义时也会捕获。Source):

if (attention != null) logFields.attention = attention;

要预先测试我是否正确识别了问题,请尝试使用邮递员通过传递布尔值将注意力值从false 更改为true - 它应该可以工作。不是相反,因为当attention 不是真实值时,永远不会设置logFields.attention

【讨论】:

非常感谢!...两种解决方案都有效!真的很感激。

以上是关于由于缺少引号,布尔值未在 MERN 堆栈中更新的主要内容,如果未能解决你的问题,请参考以下文章

反应:useContext 值未在嵌套函数中更新

IBInspectable 属性值未在 xib 中更新

输入值未在我传入 Intents 的另一个活动中更新

Python:函数返回的值未在熊猫数据框中更新

Svelte 绑定选择值未在获取时更新

RegSetValueEx返回成功,但是注册表值未在regedit中更新