数字资产Node JSjs绑定:表示'time'类型变量的语法



我正在通过教程工作,说明如何创建合同。

这是他们的代码:

function createFirstPing() {
    const request = {
        commands: {
            applicationId: 'PingPongApp',
            workflowId: `Ping-${sender}`,
            commandId: uuidv4(),
            ledgerEffectiveTime: { seconds: 0, nanoseconds: 0 },
            maximumRecordTime: { seconds: 5, nanoseconds: 0 },
            party: sender,
            list: [
                {
                    create: {
                        templateId: PING,
                        arguments: {
                            fields: {
                                sender: { party: sender },
                                receiver: { party: receiver },
                                count: { int64: 0 }
                            }
                        }
                    }
                }
            ]
        }
    };
    client.commandClient.submitAndWait(request, (error, _) => {
        if (error) throw error;
        console.log(`Created Ping contract from ${sender} to ${receiver}.`);
    });
}

我想在项目中创建一个类似的请求,该请求发送一个名为" datetime_added"的字段。在我的DAML代码中,它是类型time。我无法弄清此请求的适当语法。例如:

arguments: {
      fields: {
        sender: { party: sender },
        receiver: { party: receiver },
        count: { int64: 0 },
        datetime_added: { time: '2019 Feb 19 00 00 00' }
      }
}

我表达时间的格式不是引起问题的原因(尽管我承认这也可能是错误的)。我看到的错误如下:

Error: ! Validation error
▸ commands
  ▸ list
    ▸ 0
      ▸ create
        ▸ arguments
          ▸ fields
            ▸ datetime_added
              ✗ Unexpected key time found
    at CommandClient.exports.SimpleReporter [as reporter] (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/data/reporting/simple_reporter.js:36:12)
    at Immediate.<anonymous> (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/data/client/command_client.js:52:62)
    at runCallback (timers.js:705:18)
    at tryOnImmediate (timers.js:676:5)
    at processImmediate (timers.js:658:5)

我不明白,time不是有效的DAML数据类型吗?


编辑

我尝试将time切换到timestamp,如下所示

datetime_added: {timestamp: { seconds: 0, nanoseconds: 0 }}

引起以下错误:

/home/......../damlprojects/car/node_modules/google-protobuf/google-protobuf.js:98
goog.string.splitLimit=function(a,b,c){a=a.split(b);for(var d=[];0<c&&a.length;)d.push(a.shift()),c--;a.length&&d.push(a.join(b));return d};goog.string.editDistance=function(a,b){var c=[],d=[];if(a==b)return 0;if(!a.length||!b.length)return Math.max(a.length,b.length);for(var e=0;e<b.length+1;e++)c[e]=e;for(e=0;e<a.length;e++){d[0]=e+1;for(var f=0;f<b.length;f++)d[f+1]=Math.min(d[f]+1,c[f+1]+1,c[f]+Number(a[e]!=b[f]));for(f=0;f<c.length;f++)c[f]=d[f]}return d[b.length]};goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;goog.asserts.AssertionError=function(a,b){b.unshift(a);goog.debug.Error.call(this,goog.string.subs.apply(null,b));b.shift();this.messagePattern=a};goog.inherits(goog.asserts.AssertionError,goog.debug.Error);goog.asserts.AssertionError.prototype.name="AssertionError";goog.asserts.DEFAULT_ERROR_HANDLER=function(a){throw a;};goog.asserts.errorHandler_=goog.asserts.DEFAULT_ERROR_HANDLER;
AssertionError: Assertion failed
    at new goog.asserts.AssertionError (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:98:603)
    at Object.goog.asserts.doAssertFailure_ (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:99:126)
    at Object.goog.asserts.assert (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:99:385)
    at jspb.BinaryWriter.writeSfixed64 (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:338:80)
    at proto.com.digitalasset.ledger.api.v1.Value.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:289:12)
    at jspb.BinaryWriter.writeMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:341:342)
    at proto.com.digitalasset.ledger.api.v1.RecordField.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:1024:12)
    at jspb.BinaryWriter.writeRepeatedMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:350:385)
    at proto.com.digitalasset.ledger.api.v1.Record.serializeBinaryToWriter (/home/vantage/damlprojects/loaner_car/node_modules/@da/daml-ledger/lib/grpc/generated/com/digitalasset/ledger/api/v1/value_pb.js:822:12)
    at jspb.BinaryWriter.writeMessage (/home/vantage/damlprojects/loaner_car/node_modules/google-protobuf/google-protobuf.js:341:342)

简而言之,我需要知道在我的node.js客户端中使用哪种类型的类型time的daml值以及如何表达它。

我建议使用绑定的参考文档(尽管从0.4.0版本开始,请浏览它以回答您的问题,但我注意到了两个错误)。在页面的上部导航栏中,您可以从 class> data.commandclient 开始,然后沿其唯一的参数(submistandwaitrequest)进行工作,直到按照到不同字段的链接,您可以到达文档timestamp字段(尽管文档中存在错误),该字段应该是时间戳,其中秒钟以时期的时间表示(自1970年以来秒)。

因此,要拨打电话,这将是您应该发送的对象的形状:

arguments: {
  fields: {
    sender: { party: sender },
    receiver: { party: receiver },
    count: { int64: 0 }
    datetime_added: { timestamp: { seconds: 0, nanoseconds: 0 } }
  }
}

特别是对于您的情况,我可能会制作一个使用Date.parse功能的小助手。

function parseTimestamp(string) {
  return { seconds: Date.parse(string) / 1000, nanoseconds: 0 };
}

然后您可以在示例中提到的时间来通过:

arguments: {
  fields: {
    sender: { party: sender },
    receiver: { party: receiver },
    count: { int64: 0 }
    datetime_added: { timestamp: parseTimestamp('2019-02-19') }
  }
}

作为闭幕说明,我想补充说,Node.js绑扎的运输载有键入的文件,这些文件可为兼容编辑器提供自动完成和上下文帮助(例如Visual Studio Code)。使用这些可能会帮助您。由于绑定是用打字稿编写的,因此保证键入始终与API保持最新。请注意,暂时,自动完成为LEDGER API本身起作用,但不会为您提供针对DAML模型的任意记录(在这种情况下为fields对象)。

最新更新