在formData(ValidationError)

时间:2018-04-02 10:53:24

标签: node.js mongodb mongoose

所以我一直在努力向MongoDB发出POST请求,因为其中一个属性应该是一个对象数组。我一直在学习不同的教程,但仍然无法理解它。

我有一个数组,它是一个对象数组。

tagsArray = [
    { tag_name: "Tiger", ref: "t" },
    { tag_name: "Cheetah", ref: "c" }
];

我使用Fetch API发布它,因为它包含一个图像文件,我使用的是formData。这就是我发布它的方式......

let formData = new FormData();

formData.append('titleImage', this.state.titleImage);
for (var i = 0; i < tagsArray.length; i++) {
    formData.append('tags', JSON.stringify(tagsArray[i]));
}

var request = {
    body: formData,
    method: "POST"
}

fetch("http://localhost:3500/posts", request)
.then(res => res.json())
.then(json => {
    console.log("Post success:", json);
})
.catch(function(err) {
    console.log(err.message);
});

继续,我已经创建了一个Schema,你可以在这里看到:

const mongoose = require('mongoose');

const tagSchema = mongoose.Schema({
    tag_name: String,
    ref: String
})

const postSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    titleImage: { type: String, required: true },
    tags: { type: [tagSchema], required: true},
});

module.exports = mongoose.model('Post', postSchema);

这就是我一直试图将其保存到我的数据库的方式。

exports.create_post = (req, res, next) => {
    const post = new Post({
        _id: new mongoose.Types.ObjectId(),
        titleImage: req.file.path,
        tags: req.body.tags,
    });
    post.save().then(result => {
        res.status(201).json({
            post: {
                _id: result._id,
                tags: result.tags
            }
        });
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({
            error: err
        });
    });
}

这是控制台中记录的错误。

  

消息:'强制转换为数组失败“[   \ '{ “TAG_NAME”: “虎”, “REF”: “T”} \',\ n   \'{“tag_name”:“猎豹”,“参考”:“c”} \']“在路径”标签“',           名称:'CastError',           stringValue:'“[\'{”tag_name“:”Tiger“,”ref“:”t“} \',\ n \'{”tag_name“:”Cheetah“,”ref“:”c“} \' ]“”,           善良:'阵列',           值:[数组],           路径:'标签',           原因:[对象]}},_消息:'发布验证失败',名称:'ValidationError'}

1 个答案:

答案 0 :(得分:0)

与往常一样,当我发布一个问题时,我的竞争精神和自我带来了新的活力和动力,这使我能够更专注并完成任务。所以这就是我解决问题的方法。

我改变了postSchema:

const postSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    titleImage: { type: String, required: true },
    tags: { type: {tagName: String, tagRef: String}, required: true}
});

这里有一些配置,我将标记数组映射并将每个字符串转换为一个对象,以便我可以访问每个属性。

exports.create_post = (req, res, next) => {
    const post = new Post({
        _id: new mongoose.Types.ObjectId(),
        titleImage: req.file.path,
        tags: req.body.tags.map(tag => {
            var tagObject = JSON.parse(tag);
            return {
                tagName: tagObject.tag_name,
                tagRef: tagObject.ref
            }
        })
    });
    post.save().then(result => {
        res.status(201).json({
            post: {
                _id: result._id,
                tags: result.tags.map(tag => {
                    return {
                        tagName: tag.tagName,
                        tagRef: tag.tagRef
                    }
                }),
            }
        });
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({
            error: err
        });
    });
}

不确定最佳解决方案是否适用于我。