Javascript ValidationError:RFDeviceId:路径'RFDeviceId'是必需的

Javascript ValidationError:RFDeviceId:路径'RFDeviceId'是必需的,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我是新来的,只知道nodejs和mongodb的BAICS,所以请帮助我学习 我犯了这个错误 创建数据集时出错:ValidationError:RFDeviceId:PathRFDeviceId是必需的,坐标:Path坐标是必需的,坐标:Path坐标是必需的,速度:Path速度是必需的,sat\U跟踪:Pathsat\U跟踪是必需的。,gps固定类型:路径gps固定类型为必填项,温度A:PathtemperatureAA为必填项,湿度:路径湿度为必填项,蝙蝠v:Path蝙蝠v为必填项,蝙蝠p:P

我是新来的,只知道nodejs和mongodb的BAICS,所以请帮助我学习

我犯了这个错误

创建数据集时出错:ValidationError:RFDeviceId:Path
RFDeviceId
是必需的,坐标:Path
坐标
是必需的,坐标:Path
坐标
是必需的,速度:Path
速度
是必需的,sat\U跟踪:Path
sat\U跟踪
是必需的。,gps固定类型:路径
gps固定类型
为必填项,温度A:Path
temperatureAA
为必填项,湿度:路径
湿度
为必填项,蝙蝠v:Path
蝙蝠v
为必填项,蝙蝠p:Path
蝙蝠p
为必填项

模型中我的datasets.js就是这样

var mongoose = require("mongoose");

// Declare schema
var datasetSchema = new mongoose.Schema({
    owner_name: {type: String, required: true},
    RFDeviceId: {type: String, required: true, index: {unique: true}},
    coordinates: {type: Number, required: true},
    CoordinatesTime: {type: String, required: true},
    speed: {type: String, required: true},
    sat_tracked: {type: Number, required: true},
    gps_fix_type: {type: Number, required: true},
    temperatureata: {type: Number, required: true},
    humidity: {type: Number, required: true}, 
    bat_v: {type: Number, required: true},
    bat_p: {type: Number, required: true}
});

// Export schema
mongoose.model("Dataset", datasetSchema);```
以及路由中的my dataset.js

/* CRUD API */
// POST new dataset request
router.post("/", helper.authenticate, function(req, res) {
    // Used to set the dataset owner
    var sessionUser = req.session.user.name;
    // Get values from the post request
    var RFDeviceId = req.body.RFDeviceId;
    var coordinates = req.body.coordinates;
    var CoordinatesTime = req.body.CoordinatesTime;
    var speed = req.body.speed;
    var sat_tracked = req.body.sat_tracked;
    var gps_fix_type = req.body.gps_fix_type;
    var temperatureata = req.body.temperatureata;
    var humidity = req.body.humidity;
    var bat_v = req.body.bat_v;
    var bat_p = req.body.bat_p;
    // Delete the values from the request body so that we only keep information about the variables
    delete req.body.RFDeviceId;
    delete req.body.coordinates;
    delete req.body.CoordinatesTime;
    delete req.body.speed;
    delete req.body.sat_tracked;
    delete req.body.gps_fix_type;
    delete req.body.temperatureata;
    delete req.body.humidity;
    delete req.body.bat_v;
    delete req.body.bat_p;
    `

    // This is so that we can loop through the object in reverse order
    // We do that so that the fields are saved in the right order on the db
    // (this way it will appear in the right order on the 'edit' view)
    var propertiesList = [];
    for (var property in req.body) {
        if (req.body.hasOwnProperty(property)) {
            propertiesList.push(property);
        }
    }
    propertiesList.reverse();

    var variablesFields = {};
    for (var i in propertiesList) {
        console.log(propertiesList[i])
        variablesFields[propertiesList[i]] = {name:req.body[propertiesList[i]],
                                    values: Array}; 
    }

    // Create dataset 
    Dataset.create({
        RFDeviceId: RFDeviceId,
        coordinates: coordinates, 
        CoordinatesTime: CoordinatesTime,
        speed: speed,
        sat_tracked: sat_tracked,
        gps_fix_type: gps_fix_type,
        temperatureata: temperatureata,
        humidity: humidity,
        bat_v: bat_v,
        bat_p: bat_p,
        owner_name: sessionUser
    }, function(err, dataset) {
        if (err) {
            console.log("Error creating the dataset: " + err);
            req.session.error = "A problem occured when creating the dataset. Please try again.";
        } else {
            console.log("New dataset created with id: " + dataset._id);
            req.session.success = "Dataset " + "name" + " created successfully.";
        }
        res.redirect("/index");
    });
});

// PUT request to update dataset
router.put("/:id/", helper.authenticate, function(req, res) {
    // Get values from the POST request
    var RFDeviceId = req.body.RFDeviceId;
    var coordinates = req.body.coordinates;
    var CoordinatesTime = req.body.CoordinatesTime;
    var speed = req.body.speed;
    var sat_tracked = req.body.sat_tracked;
    var gps_fix_type = req.body.gps_fix_type;
    var temperatureata = req.body.temperatureata;
    var humidity = req.body.humidity;
    var bat_v = req.body.bat_v;
    var bat_p = req.body.bat_p;
    // Delete the values from the request body so that we only keep information about the variables
    delete req.body.RFDeviceId;
    delete req.body.coordinates;
    delete req.body.CoordinatesTime;
    delete req.body.speed;
    delete req.body.sat_tracked;
    delete req.body.gps_fix_type;
    delete req.body.temperatureata;
    delete req.body.humidity;
    delete req.body.bat_v;
    delete req.body.bat_p;

    var setList = {};
    var unsetList = {};
    var updateQuery = {};

    // Find dataset by id
    Dataset.findById(req.params.id, function(err, dataset) {
        updateQuery = {
            RFDeviceId: RFDeviceId,
            coordinates: coordinates, 
            CoordinatesTime: CoordinatesTime,
            speed: speed,
            sat_tracked: sat_tracked,
            gps_fix_type: gps_fix_type,
            temperatureata: temperatureata,
            humidity: humidity,
            bat_v: bat_v,
            bat_p: bat_p,
        }
        // If variable in request body and not in dataset, add to setList (or if no variable at all in dataset)
        for (var property in req.body) {
            if (!dataset.data||(req.body.hasOwnProperty(property)&!dataset.data.hasOwnProperty(property))) {
                console.log(property)
                console.log(req.body[property])
                setList["data."+ property] = {name:req.body[property],
                                                values: Array}; 
            }
        }

        // If variable in dataset but not in request body, add to unsetList
        for (var property in dataset.data) {
            if (dataset.data&&dataset.data.hasOwnProperty(property)&!req.body.hasOwnProperty(property))
            {
                unsetList["data."+property] = true;
            }
        }

        // If setList or unsetList non-empty, add to updateQuery
        if (Object.keys(setList).length) {
            updateQuery["$set"] = setList;
        }
        if (Object.keys(unsetList).length) {
            updateQuery["$unset"] = unsetList;
        }

        // Update dataset
        dataset.update(updateQuery, function(err, response) {
            if (err) {
                console.log("Error updating dataset: " + err);
                req.session.error = "Update failed, please try again.";
            } else {
                console.log("Update on dataset: " + dataset._id);
                req.session.success = "Update successul.";
            }
            res.redirect("/index");
        });
    });
});
如果我设置了required:false expect with owner\u name,那么它发送的第一个数据发送时间
MongoError:E11000重复键错误集合:test.datasets index:index\u 1 dup key:{:null}

输出屏幕截图


当您创建模型中所需的所有字段时,请大家非常高兴地帮助它。

。因此,无论何时创建任何数据集,都需要提供所有必需字段的数据

在创建数据集查询API中,首先直接将req.body.[field value]分配给一个新变量,该变量也复制了该原始变量的引用

删除原始变量时,复制的变量也会丢失其值并设置为“未定义”。 现在,您的创建查询如下所示:

// POST new dataset request
router.post("/", helper.authenticate, function(req, res) {
    // Used to set the dataset owner
    var sessionUser = req.session.user.name;
    // Get values from the post request
    var RFDeviceId = req.body.RFDeviceId;
    var coordinates = req.body.coordinates;
    var CoordinatesTime = req.body.CoordinatesTime;
    var speed = req.body.speed;
    var sat_tracked = req.body.sat_tracked;
    var gps_fix_type = req.body.gps_fix_type;
    var temperatureata = req.body.temperatureata;
    var humidity = req.body.humidity;
    var bat_v = req.body.bat_v;
    var bat_p = req.body.bat_p;

    // This is so that we can loop through the object in reverse order
    // We do that so that the fields are saved in the right order on the db
    // (this way it will appear in the right order on the 'edit' view)
    var propertiesList = [];
    for (var property in req.body) {
        if (req.body.hasOwnProperty(property)) {
            propertiesList.push(property);
        }
    }
    propertiesList.reverse();

    var variablesFields = {};
    for (var i in propertiesList) {
        console.log(propertiesList[i])
        variablesFields[propertiesList[i]] = {name:req.body[propertiesList[i]],
                                    values: Array}; 
    }

    // Create dataset 
    Dataset.create({
        RFDeviceId: RFDeviceId,
        coordinates: coordinates, 
        CoordinatesTime: CoordinatesTime,
        speed: speed,
        sat_tracked: sat_tracked,
        gps_fix_type: gps_fix_type,
        temperatureata: temperatureata,
        humidity: humidity,
        bat_v: bat_v,
        bat_p: bat_p,
        owner_name: sessionUser
    }, function(err, dataset) {
        if (err) {
            console.log("Error creating the dataset: " + err);
            req.session.error = "A problem occured when creating the dataset. Please try again.";
        } else {
            console.log("New dataset created with id: " + dataset._id);
            req.session.success = "Dataset " + "name" + " created successfully.";
        }
        res.redirect("/index");
    });
});
我希望你有正确做这件事的想法


[如果这个答案对你有帮助的话,请对它投赞成票]

嗨,你能通过提供一个示例文档和预期输出来解释吗?请用这个信息更新你的问题。你能帮我指出我犯了什么错误吗。非常荣幸@SuleymanSahI感谢您回答我的问题,但我已经检查了这种情况,错误是相同的。如果您有更好的想法,请帮助。