【问题标题】:How to throw an error from server side and catch it from client side?如何从服务器端抛出错误并从客户端捕获它?
【发布时间】:2017-04-13 17:14:07
【问题描述】:

我在使用 throw new Meteor.Error 的服务器方法中抛出一个错误。

客户端似乎没有接它,回调的error参数始终是undefined,但在终端它throws出错并重新启动Meteor。

W20170413-17:27:28.900(1)? (STDERR) /home/xeconcepts/.meteor/packages/meteor-tool/.1.4.2-1-beta.1.si3hb0++os.linux.x86_64+web.browser+web.cordova/mt-os.linux .x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:280 W20170413-17:27:28.900(1)? (STDERR)抛出(前); W20170413-17:27:28.900(1)? (标准错误)^ W20170413-17:27:29.175(1)? (STDERR) 错误:carte exists [204] W20170413-17:27:29.175(1)? (STDERR) 在 imports/api/users/methods.js:211:47

和条纹methods

const Stripe = require('stripe');
const stripe = Stripe("sk_test_pO*******MUDXjlF8v");

仅适用于

if(Meteor.isServer)

如何从服务器端抛出错误并从客户端捕获?

方法代码:

export const addCCStudent = new ValidatedMethod({
    name: 'addCCStudent',
    validate: new SimpleSchema({
        id: {
            type: String
        },
        number: {
            type: String
        },
        dateMM: {
            type: String
        },
        dateYYYY: {
            type: String
        },
        cvc: {
            type: String
        }
    }).validator(),
    run(p) {
        try {
            if (Meteor.isServer) {
                const Fiber = require('fibers');
                const Stripe = require('stripe');
                const stripe = Stripe("*************");


                stripe.tokens.create({
                    card: {
                        "number": p.number,
                        "exp_month": p.dateMM,
                        "exp_year": p.dateYYYY,
                        "cvc": p.cvc
                    }
                }, function(err, token) {
                    console.log("tokenserr", err);
                    console.log("token", token);
                    if (!err) {
                        Fiber(function() {
                            //  console.log("p", p)
                            var user = Meteor.users.findOne({
                                _id: p.id
                            });
                            //console.log("addCCStudentuser", user);
                            if (user) {
                                var cCArray = user.profile.UserCards;
                                if (cCArray) {
                                    var exist = false;
                                    for (var i = 0; i < cCArray.length; i++) {
                                        if ((cCArray[i].number == p.number) && (cCArray[i].dateMM == p.dateMM) && (cCArray[i].dateYYYY == p.dateYYYY)) {
                                            exist = true
                                        }
                                    }

                                    if (exist) {
                                        throw new Meteor.Error(204, "carte existe");
                                    } else {

                                         Meteor.users.update({
                                            _id: p.id,
                                        }, {
                                            $push: {
                                                'profile.UserCards': { number: p.number, dateMM: p.dateMM, dateYYYY: p.dateYYYY }
                                            }
                                        });
                                    }
                                }
                            }
                        }).run();
                    } else {
                        // console.log("errerrerrerr", err.raw.message);
                        throw new Meteor.Error(204, err.raw.message);
                    }

                });
            }

        } catch (error) {
            console.log("error", error)
            throw new Meteor.Error(203, error.reason);
        }

    },
});

【问题讨论】:

  • 我可以看看你的完整代码吗?你怎么解决这个错误
  • 如果你不发布你的代码就帮不上忙

标签: javascript meteor


【解决方案1】:

理想情况下,Meteor 应该捕获直接在方法中抛出的任何错误,但在您的情况下,大多数错误都包含在 Fiber 函数调用中这一事实可能会加剧这种情况。

因此,您可能会在服务器端抛出错误,但它永远不会冒泡到方法的调用者(它在客户端,并且期望来自ValidatedMethod 的响应)。

尝试返回Fiber 函数的结果。查看fibers 包的文档中的示例,try-catch 块需要围绕 Fibers 函数调用,而不是围绕 ValidatedMethod 的全部内容。

此外,您还可以尝试在所有错误语句之前添加return。例如

return throw new Meteor.Error(204, "carte existe")

注意:如果您在尝试访问此错误的地方共享客户端代码也很好。

【讨论】:

    【解决方案2】:

    请试试这个。 在您抛出错误的光纤中,将其替换为抛出错误的函数

        if (exist) {
           ErrorFunction()
       }
    

    光纤外放功能

    ErrorFunction() {
           throw new Meteor.Error(204, "carte existe");
    }
    

    看看客户端现在是否能够捕捉到相同的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多