技术栈: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