RestAPI正在使用其他模型删除模型

时间:2018-04-08 19:53:01

标签: javascript node.js rest express mongoose-schema

编辑:我的教授告诉我,不要从管理员那里访问驱动程序。应该只在司机内部。

我正在使用restAPI进行项目,并且要求管理员可以删除驱动程序。

他们每个人都有自己的架构和模型在他们自己的.js文件中

var mongoose = require('mongoose');
var AdminSchema = new mongoose.Schema({
name: String
});
mongoose.model('Admin', AdminSchema); // Model name is 'Admin'
module.exports = mongoose.model('Admin'); // Export for use in other parts of program

同样对于司机......

我正在使用Postman测试所有这些,

现在我不得不让我的管理员能够使用他们的ID

从管理数据库和驱动程序数据库中删除

管理员的DELETE方法如下:

var Admin = require('./Admin');
var Driver = require('./Driver'); 
.
.
.
router.delete('/:id', function (req, res) {
    Admin.findByIdAndRemove(req.params.id, function (err, admin) {
        if (err) return res.status(500).send("There was a problem deleting the admin.");
        res.status(200).send("Admin: " + admin.name + " was deleted.");
    });
});

我尝试了很多东西,包括看起来像这样的方法

router.delete('/:id', function (req, res) {
    Admin.findByIdAndRemove(req.params.id, function (err, admin) {
        if (err) return res.status(500).send("There was a problem deleting the admin.");
        res.status(200).send("Admin: " + admin.name + " was deleted.");
    });
    Driver.findByIdAndRemove(req.params.id, function (err, driver) {
        if (err) return res.status(500).send("There was a problem deleting the driver.");
        res.status(200).send("Driver: " + driver.name + " was deleted.");
    });
});

但这不起作用,我尝试单独使用这些方法,但程序只查找最先出的方法,所以如果我有方法在admin的delete方法之前删除驱动程序,它会找到司机,但不是管理员。它只是触发驱动程序的错误消息,并且不会触发管理员删除方法。

任何提示或建议将不胜感激。这是我第一次学习这些东西,而且非常有趣,但它非常棘手!

谢谢!

1 个答案:

答案 0 :(得分:0)

调用数据库查询的方式不正确。调用from rest_framework import serializers from deployedcontracts.models import DeployedContracts class DeployedContractsSerializer(serializers.ModelSerializer): class Meta: model = DeployedContracts fields = ('house_no', 'rent', 'security_deposit', 'house_owner', 'house_tenant', 'deployed_contract_address') Admin.findByIdAndRemove都是异步的,因此您需要将它们视为异步。您还无法从路由处理程序中调用 Driver.findByIdAndRemove 两次。它应该导致错误“无法在发送标题后发送标题”或类似的内容。

一种方法可能是:

res.status(200).send(..

另请注意,进行多个查询会导致难以使用corect http状态,因为每个db查询可能会产生不同的结果

更好的方法是让2个路由一个用于管理员,另一个用于驱动程序

router.delete('/:id', function (req, res) {
    var response = '';
    Driver.findByIdAndRemove(req.params.id, function (err, driver) {

        if (err) 
            response += "There was a problem deleting the driver.";
        else
            response += "Driver: " + driver.name + " was deleted.";

        Admin.findByIdAndRemove(req.params.id, function (err, admin) {

            if (err) 
                response += "There was a problem deleting the admin.";
            else
                response += ("Admin: " + admin.name + " was deleted.";

            // you can't use error status since both db results could be different

            res.status(200).send(response);
        });

    });
});