0

技术栈:HyperledgerFabric 1.4,FabricSamples Go 下的 Project-repository-FirstNetwork - v1.15,Goa- v3.2.5

要求:使用 Goa 框架,我需要触发一个 Post 请求(http://localhost:8000/createChannelProfile),它必须返回文件的内容作为响应。用户将从前端输入 channelName 和 channelProfile。基本上路由以这种方式发生,触发 rest-api 请求——这个方法必须调用脚本文件——脚本文件中的命令应该生成一个文件——该文件必须作为响应发送。我现在卡住的地方是脚本文件中的命令没有被执行。它以状态码 127 退出并返回“失败”响应。作为第一次试用的一部分,我只是将字符串作为响应而不是生成的输出文件返回。我有点新去和果阿,仍在弄清楚如何发送文件作为响应。如果有人知道,请尝试给我一个提示。

我已经尝试过堆栈溢出的类似解决方案。但无法解决错误。

 design.go 
    
    package design
    
    import (
        "fmt"
        . "goa.design/goa/v3/dsl"
    )
    
    var _ = API("fabric", func() {
        Title("An api for fabric")
        Description("A simple goa service")
        Server("fabric", func() {
            Host("localhost", func() {
                URI("http://localhost:8000")
            })
        })
    })
    
    var _ = Service("fabric", func() {
        Description("The service to create a channel.tx file under channel-artifacts folder")
        //Method to add a new Channel Profile
        Method("create", func() {
            Payload(func() {
                Field(1, "channelName", String, "Name of the channel")
                Field(2, "channelProfile", String, "Name of the channel profile")
                Required("channelName", "channelProfile")
            })
            Result(String)
            Error("not_found", ErrorResult, "channelProfile not found")
            HTTP(func() {
                POST("/createChannelProfile")
                Response(StatusCreated)
            })
        })
        Files("/openapi.json", "./gen/http/openapi.json")
    })

面料.go

//这是调用generateChannel.sh文件的文件

package fabricapi

import (
    fabric "GoApp2/gen/fabric"
    "context"
    "fmt"
    "log"
    "os/exec"
)

// fabric service example implementation.
// The example methods log the requests and return zero values.
type fabricsrvc struct {
    logger *log.Logger
}

// NewFabric returns the fabric service implementation.
func NewFabric(logger *log.Logger) fabric.Service {
    return &fabricsrvc{logger}
}

// Create implements create.
func (s *fabricsrvc) Create(ctx context.Context, p *fabric.CreatePayload) (res string, err error) {
    s.logger.Print("fabric.create")
    cmd := exec.Command("/bin/bash", "../generateChannel.sh", p.ChannelName, p.ChannelProfile)
    stdout, err := cmd.Output()
    fmt.Errorf("error %s", err)
    s.logger.Print(p.ChannelName)
    s.logger.Print(p.ChannelProfile)
    output := string(stdout)
    s.logger.Print(output)
    res = output

    return res, nil
}

generateChannel.sh 文件

#!/bin/bash
export CHANNELNAME="$1"
export CHANNELPROFILE="$2"

../bin/configtxgen -profile "${CHANNELPROFILE}" -outputCreateChannelTx "./channel-artifacts/${CHANNELNAME}.tx" -channelID "${CHANNELNAME}"
res=$?
echo ${res}
if [ $res -eq 0 ]; then
  echo "success"
  else
  echo "failed"
fi

注意:我已经单独测试过这个文件,它执行得很好。脚本文件中的上述命令查找在 configtx.yaml 文件中定义的 channelProfile 和 channelName 并相应地生成 channel.tx 文件。我已经定义了环境变量并添加了 .bashrc 和 .profile 文件的路径。请帮助我哪里出错了。

go env 截图 go env 截图

邮递员的输出:

邮递员的输出:

终端输出:

:~/workspace/fabric-samples/first-network/GoApp2$ ./fabric
[fabricapi] 12:47:59 HTTP "Create" mounted on POST /createChannelProfile
[fabricapi] 12:47:59 HTTP "./gen/http/openapi.json" mounted on GET /openapi.json
[fabricapi] 12:47:59 HTTP server listening on "localhost:8000"
[fabricapi] 12:48:05 id=95ISzo9L req=POST /createChannelProfile from=127.0.0.1
[fabricapi] 12:48:05 fabric.create
[fabricapi] 12:48:06 mychannel
[fabricapi] 12:48:06 TwoOrgsChannel
[fabricapi] 12:48:06 127
failed
4

0 回答 0