Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 主干、节点和Mongo错误验证和通信_Node.js_Mongodb_Validation_Backbone.js_Error Handling - Fatal编程技术网

Node.js 主干、节点和Mongo错误验证和通信

Node.js 主干、节点和Mongo错误验证和通信,node.js,mongodb,validation,backbone.js,error-handling,Node.js,Mongodb,Validation,Backbone.js,Error Handling,我试图解决以下两个问题: 在model.save()上,确保条目不是Mongo中现有条目的副本。如果是,则显示UI错误 在model.save()之前,对字段输入进行验证,以确保没有像空白字段+显示UI错误这样有趣的事情 首先是设置 通过节点的Mongo模式。 // setup Server, include mongoose, connect to db var List = new Schema({ titleKey: { type: String,

我试图解决以下两个问题:

  • model.save()
    上,确保条目不是Mongo中现有条目的副本。如果是,则显示UI错误
  • model.save()之前,
    对字段输入进行验证,以确保没有像空白字段+显示UI错误这样有趣的事情
  • 首先是设置

    通过节点的Mongo模式。

    // setup Server, include mongoose, connect to db
    
    var List = new Schema({
        titleKey: {
            type: String,
            lowercase: true,
            trim: true,
            index: {
                required: true,
                unique: true,
                dropDups: true
            }
        },
        title: String
    });
    
    用于保存列表的API端点

    app.post('/api/lists', function(req, res){
        var list = new ListModel({
            titleKey: generateTitleKey(req.body.title),
            title: req.body.title,
        });
    
        return list.save(function(err){
            if(!err) {
                console.log('saved list');
                return res.send(JSON.stringify(list));
            } else {
                console.log(err);
                return res.send(JSON.stringify({
                    err: true,
                    errSrc: "list",
                    errType: "insert",
                    errMsg: "That's already a list!"
                }));
            }
        });
    });
    
    最后,模型视图的主干.save()方法

    save: function() {
    
        /* this is called from a lightbox that might be creating a new list, or editing an existing one, so there may already be a model pre-loaded into this point. */
    
        var _self = this;
            newTitle = _self.$el.find('input[name="new-list-name"]').val();
    
        // create model
        _self.opts.model = new app.AchievementList({
            title: newTitle,
        });
    
        _self.opts.model.save(null, {
            wait: true,
            success: function(model, res) {
                new app.AchievementListView({ model: _self.opts.model });
            },
            error: function(model, error) {}
        });
    },
    
    这就是我战略崩溃的地方

    主干网
    .save({success/error})
    在侦听Mongo错误输出时,行为不符合预期

    理想情况下,我希望Mongo执行重复错误处理。它已经检测到重复项并抛出错误,为什么不呢。但是后来我发现,来自API的任何回复都被视为
    成功:
    .save()
    方法中的响应,因此即使出现错误,视图也会被呈现,因为触发了技术上的成功。我是否在
    成功:
    内执行错误检查?看起来这就是
    错误:
    的作用,但是我会抛出服务器错误响应(比如501)来强制执行
    错误:
    处理程序,并且501会显示在控制台中。这似乎不对,根本不是“我无法到达服务器”

    我想到的另一种方法是运行一个wrapping
    $.ajax(GET)
    请求,查找重复条目,然后相应地执行操作。但如果我这么做,为什么还要麻烦问Mongo来防止重复?我永远不会提交一份副本,如果我提交了,我也不会知道,没有什么可以抓住这个错误。感觉好像我错过了Mongos强大的错误处理功能,在需要服务器提供任何信息时,我会进行各种随机的ajax调用和API查找。不好

    Backbones
    model.validate()
    方法不适合检查输入错误并简单地中断保存流程

    save: function() {
    
        /* this is called from a lightbox that might be creating a new list, or editing an existing one, so there may already be a model pre-loaded into this point. */
    
        var _self = this;
            newTitle = _self.$el.find('input[name="new-list-name"]').val();
    
        // create model
        _self.opts.model = new app.AchievementList({
            title: newTitle,
        });
    
        _self.opts.model.save(null, {
            wait: true,
            success: function(model, res) {
                new app.AchievementListView({ model: _self.opts.model });
            },
            error: function(model, error) {}
        });
    },
    
    但是好吧,假设我在
    success:
    中解析响应,并阻止
    view.render()
    。好的当我在提交前验证输入字段时,我又碰到了另一面墙。Backbones
    validate
    方法做了一件奇怪的事情,您必须倾听模型的“无效”更改。问题是运行
    model.save()
    的部分在初始化时并不总是在视图中有一个模型,所以我无法将侦听器绑定到可能不存在的部分。因此,通常要做的就是用一个通用的
    if-else
    check手动检查字段,但这看起来不像。MV的全部要点是模型应该处理它们自己的错误等等,所以如果我在它们之外方便的地方进行验证。。。这似乎有点不对劲。在
    保存({success:})
    中强制执行错误检查也是如此


    我知道从技术上讲,这是很多抱怨和抱怨,但我学习这些东西的全部意义在于我想知道如何正确处理它们。我知道这里提到的所有3个框架都有强大的工具来处理常见的需求,比如验证,所以我忍不住觉得我缺少了一些解决这些典型问题的常识性方法。如果有人能给我任何关于这些问题的见解,我将不胜感激。同时解决这些问题真的很痛苦

    这里的问题是,无论服务器中的错误状态如何,API端点都返回200(成功)。它应该返回与错误类型匹配的适当错误代码,以便主干截获错误。例如,对于重复记录,通常的做法是返回409冲突(请参阅)。 假设您将express与node.js一起使用,则在发送响应之前,可以通过以下方式发送状态:

    ...
    res.status(409);
    ...
    return res.send(...
    
    然后,在主干模型上,作为模型事件的一部分实现错误侦听器:

    MyModel = Backbone.Model.extend({
      ...
      events: {
       'error': 'errorHandler',
      },
      ...
      errorHandler: function(error) {
        // do something with that error
      }
    });
    

    然后,您的模型可以发送视图将捕获的事件,以便向用户显示相应的错误消息。

    您还可以执行一个很酷的单行程序
    返回res.status(409)。发送(…)
    如果我开始从服务器返回409,我担心的是,这将开始将所有错误记录到控制台中。重复条目是UI中经常发生的事情,在普通应用程序中有一个充满服务器响应代码的控制台可以吗?完全可以。现在,你可能想开发你的客户端应用程序,这样它就不会生成那些坏的请求,这很奇怪,但是如果我首先设置客户端应用程序来防止坏的请求(我肯定想到了这种方法),那么为什么要让Mongo先做它的条件呢。当我了解到唯一键和重复键时,它似乎是测试错误的主要方法。这更像是一种“以防所有其他错误检查失败”类型的交易吗?不管怎样,谢谢你的回答。大帮助。你的服务器应该随时准备处理错误,因为它传入的请求不一定来自你的客户端应用(你可以有几个客户端应用使用同一个服务器应用)。无论客户端应用程序是如何设计的,服务器都应该处理所有情况。