Javascript 将 [object Object] 呈现为字符串数据类型

Posted

技术标签:

【中文标题】Javascript 将 [object Object] 呈现为字符串数据类型【英文标题】:Javascript rendering [object Object] as string data type 【发布时间】:2022-01-13 15:19:40 【问题描述】:

我已经尝试解决这个问题一段时间了。这是我的 JS 类:

class Comment 
        constructor(comment) 
            
            this.id = comment.id
            this.comment = comment
        
    
        static createComment(e)
            e.preventDefault()
            const commentMessage = e.target.children[0].value
            const commentList = e.target.previousElementSibling
            
    
            Comment.submitComment(commentMessage, commentList)
            e.target.reset()
        
    
        renderComment(commentList)
            const p = document.createElement('p')
            p.dataset.id = this.id
            p.innerText = "- " + this.comment + " "
        
    
        static submitComment(commentMessage, commentList)
    
            fetch(commentsURL, 
                method: "POST",
                headers: 
                    "Content-Type": "application/json",
                    "Accept": "application/json",
                ,
                body: JSON.stringify(
                    comment: commentMessage
                ),
            )
            .then(response => response.json())
            .then(comment => 
                let newComment = new Comment(comment)
                newComment.renderComment(commentList)
            )
        
        
```

从我的 Rails API 返回以下错误:

"NoMethodError (未定义的方法`permit' for "comment":String):

app/controllers/cmets_controller.rb:24:in comment_params' app/controllers/comments_controller.rb:8:in create'"

这是那个控制器:

class CommentsController < ApplicationController
    def index
        comments = Comment.all
        render json: comments
    end

    def create
        comment = Comment.new(comment_params)
        if comment.save
            render json: comment
        else
            render json: errors: comment.errors.full_messages
        end
    end

    private

    def comment_params
        params.require(:comment).permit(:comment)
    end
end

欢迎任何帮助,如有需要,我会尽量保持清晰。

【问题讨论】:

自己解决了这个问题,只需在我的数据库中添加一个“文本”属性作为字符串类型。就这么简单:) 【参考方案1】:

看起来 ruby​​ 控制器正在尝试对返回字符串执行操作,该操作不是有效的方法。你从哪里得到.permit()?也许在 ruby​​ 论坛上提问?

它返回 [Object object] 的原因是您在获取请求中期望一个 json 对象。您通常只会渲染从 json 对象中的一个值返回的字符串,但在这种情况下,它是一个错误对象。

【讨论】:

【参考方案2】:

你用这个发布你的 cmets:

fetch(commentsURL, 
    method: "POST",
    headers: 
        "Content-Type": "application/json",
        "Accept": "application/json",
    ,
    body: JSON.stringify(
        comment: commentMessage
    ),
)

这意味着您将像 "comment": "Comment text goes here..." 这样的 JSON 发送到 Rails。

然后在 Rails 中你尝试用这个解压:

params.require(:comment).permit(:comment)

这就是说“参数必须具有comment 字段,并且在该comment 字段中查找comment 字段”。所以它正在寻找这样的 JSON:


  "comment": 
    "comment": "Comment text goes here.."
  

所以更改您的 JSON 以匹配您的参数解析:

JSON.stringify(
  comment:  comment: commentMessage 
)

或更改您的参数解析以匹配您的 JSON:

params.permit(:comment)

【讨论】:

谢谢。我对 API 进行了一些重构,以减少冗余。但显然错误现在来自前端。它不断返回 [object Object] 而不是字符串。我已经尝试解决它好几天了,我很沮丧。如果您想更深入地了解它,请随时查看整个 repo:github.com/Roeck/TEST1 那么 commentMessagejavascript 端到底是什么? "commentMessage" 是我用来尝试指定字符串数据类型的属性,如果这有意义的话。我刚刚删除了它,它没有任何区别。详细信息:在我的构造函数中,我有“this.comment = comment”,它呈现“[object Object]”。如果我删除这一行,它会呈现“未定义”。如果我使用“this.comment = comment.id”,它显然会返回提交评论的索引号。看来我们已经非常接近解决方案了 但是createComment 调用submitComment 而那只是抓住e.target.children[0].value。那么为什么e.target.children[0].value 是一个 JavaScript 字符串化对象呢?

以上是关于Javascript 将 [object Object] 呈现为字符串数据类型的主要内容,如果未能解决你的问题,请参考以下文章

javascript学习笔记

数组声明和使用要点

关于Vue响应式原理

10.31

类型和原生函数及类型转换

将 Dictionary<string, object> 转换为匿名对象?