功能节点,将文件上传到ipfs并返回文件哈希

时间:2019-06-16 17:16:31

标签: javascript node-red ipfs

我对JavaScript不太了解,但是我真的很喜欢Node-Red框架来连接到IoT设备。我构建了一个小流程,该流程将http请求节点(以获取图片)连接到功能节点,并将功能节点连接到msg-debug节点(以查看发生了什么事情)。

该图片已成功被请求节点捕获,我在功能节点中使用了此javascript函数将有效负载(图像)发送给IPFS进行上传,并获取了上传文件的哈希值,但它没有工作。我在做什么错了?

请注意,IPFS守护程序已启动并在我的计算机上的http://localhost:5001/

上运行

我尝试了不同的脚本(来自node.js或其他在线示例),但没有一个起作用。

这是功能节点中的代码:

//const ipfsAPI = require('ipfs-api');

var payload=msg.payload;

function toIPFS(file) {
    return new Promise(resolve => {
        const reader = new FileReader();
        reader.onloadend = function() {
        const ipfs = IpfsApi('ipfs', 5001,{protocol : "http"}) // Connect to IPFS
        const buf = buffer.Buffer(reader.result) // Convert data into buffer
        ipfs.files.add(buf, (err, result) => { // Upload buffer to IPFS
            if(err) {
              return "error";
            }
              let url = `https://ipfs.io/ipfs/${result[0].hash}`
              resolve('resolved url');
          })
        }
        reader.readAsArrayBuffer(file); // Read Provided File
        //console.log(`done!!!!`)
   });
  }
//var test = toIPFS(payload);
toIPFS(payload);

return msg;

我最终从msg-debug节点获得的消息对象看起来像这样:

object
_msgid: "80561394.e873e"
topic: ""
payload: ""
statusCode: 200
headers: object
accept-ranges: "bytes"
access-control-allow-origin: "*"
access-control-expose-headers: "Content-Length"
cache-control: "max-age=604800, must-revalidate"
content-type: "image/jpeg"
date: "Sun, 16 Jun 2019 16:39:46 GMT"
last-modified: "Thu, 28 Jun 2018 04:32:21 GMT"
server: "ECS (lcy/1D6A)"
strict-transport-security: "max-age=631138519"
surrogate-key: "media media/bucket/2 media/1012192454752301056"
x-cache: "HIT"
x-connection-hash: "4d2ce5d9ed372dccc93b26cf6e8ce8c4"
x-content-type-options: "nosniff"
x-response-time: "460"
content-length: "127686"
connection: "close"
x-node-red-request-node: "6f2e7990"
responseUrl: "https://upload.wikimedia.org/wikipedia/commons/1/12/K2_2006b.jpg"
redirectList: array[0]

1 个答案:

答案 0 :(得分:0)

不需要任何文件处理,因为您已经将文件的内容保存在缓冲区中(在'''some non ascii character''' <b:FatturaElettronica xmlns:b="#"> <FatturaElettronicaHeader> <DatiTrasmissione> <IdTrasmittente> <IdPaese>IT</IdPaese> </IdTrasmittente> </DatiTrasmissione> </FatturaElettronicaHeader> </b:FatturaElettronica> 中)。

因此您应该可以致电:

msg.payload

(假设您已将const ipfs = IpfsApi('ipfs', 5001,{protocol : "http"}) ipfs.files.add(buf, (err, result) => { msg.payload = result[0].hash; node.send(msg) }) 模块添加到global context中,因此它在范围内。)