2

リターンをコールバックでラップすると、サーバーの Meteor.method が正常な応答を返すのに問題があります。

コールバックでラップされていない場合は正常に機能します。

コールバックでラップされている場合とラップされていない場合の両方で、新しい Meteor.errors をスローできます。

このまったく同じ方法でクライアント側で Meteor.call をラップすると、正常に機能します。

しかし、何らかの理由でサーバーでこれを行うと、return が呼び出されたときに応答値が返されません。

ここに例があります。これは私の正確なコードではありませんが、非常に近いです。しかし、それは非常に近いです。

Meteor.methods({
  insertData: insertData
});

function insertData(params){
 validateParams(params, function(bool, msg){
  if(bool){
    //do stuff, like insert records
    result = 'thanks a million gagillions';
    console.log(result);
    return result;
  } else {
    throw new Meteor.Error(513, msg);
  }
 });
}

validateParams(params, callback){
  for (var key in params) {
    value = params[key];
    if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value)) {
      callback(false, 'Please enter your "'+ key + '".'); 
      return;
    }
  }
  callback(true);
}

結果が返されるようにするにはどうすればよいですか?

4

2 に答える 2

3

あなたの問題は、 return ステートメントが に渡す関数に属していることですvalidateParams。関数には属しませんinsertData

コード セクションを分割すると、これがよくわかります。

function insertFunc(bool, msg) {
  // do your work
  return result;
}

function insertData(params) {
  validateParams(params, insertFunc);
  // no return statement..
}

でコールバックの戻り値を伝播する必要がありますvalidateParams

validateParams(params, callback){
  for (var key in params) {
    value = params[key];
    if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value)) {
      return callback(false, 'Please enter your "'+ key + '".');  // <----- here
    }
  }
  return callback(true); // <---- and here
}

次に、関数での結果を返しvalidateParamsます。

function insertData(params){
  return validateParams(params, function(bool, msg) {
    // your code..
  });
}

注: 例外のスローは、try/catch ブロックに到達するまで伝搬されるため機能します。

于 2012-05-10T20:57:33.200 に答える
1

ここではコールバックは必要ありません。直線コードの方が読みやすいかもしれません。

Meteor.methods({
  insertData: insertData
});

function insertData(params){
  // run validator, allow exception to propagate
  validateParams(params);

  //do stuff, like insert records
  result = 'thanks a million gagillions';
  console.log(result);
  return result;
}

function validateParams(params){
  for (var key in params) {
    value = params[key];
    if(_.isEmpty(value) || _.isUndefined(value) || _.isNull(value))
      throw new Meteor.Error('Please enter your "'+ key + '".');
  }
  // not strictly necessary, just don't throw exception.
  return true;
}
于 2012-05-10T23:34:15.133 に答える