【问题标题】:RestAPI's deleting a model with another modelRestAPI 用另一个模型删除一个模型
【发布时间】:2018-04-08 19:53:01
【问题描述】:

编辑:我的教授刚刚通知我不要从管理员内部访问驱动程序。应仅在内部驱动程序中。

我正在使用 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 从管理员数据库和驱动程序数据库中删除

admin 的 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.");
    });
});

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您调用数据库查询的方式不正确。 Admin.findByIdAndRemoveDriver.findByIdAndRemove 两个调用都是异步的,因此您需要这样对待它们。您也不能从路由处理程序调用 res.status(200).send(.. 两次。它应该会导致一个错误"Can't send headers after they have been sent"或类似的东西。

    一种方法可能是:

    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);
            });
    
        });
    });
    

    另外请注意,进行多个查询会使使用正确的 http 状态变得困难,因为每个 db 查询可能有不同的结果

    更好的方法是设置 2 条路线,一条供管理员使用,另一条供司机使用

    router.delete('/driver/:id', function (req, res) {
        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.");
        });
    });
    
    router.delete('/admin/: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.");
        });
    });
    

    【讨论】:

    • 感谢您的回复@Molda 我在顶部编辑了这个,但似乎我的教授说我们不应该在 Admin 中使用 Driver 模型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多