未定义NodeJS缓冲区

时间:2018-08-02 21:59:25

标签: node.js buffer web3

我正在尝试使用Web3将交易发送到以太坊区块链上。 web3的所有部分似乎都工作正常。

第一步需要“缓冲”节点包,以将私钥转换为某种“缓冲”格式。我无法终生获得Buffer来定义自己。我知道该缓冲区已安装在node_modules中,并且已将其包含在app.js和正在工作的节点控制器中。

var Buffer = require("buffer").Buffer;

还有其他原因使缓冲区保持未定义状态吗?

index.hbs

    <h1>{{title}}</h1>
<p>Welcome to {{title}}</p>

<h2>Submit User Data</h2>
<form action="/addUser" method="post">
    <p>User<br><input type="text" name="userName" value="" /></p>
    <p>Address<br><input type="text" name="eth_address" value="" /></p>
    <p>Data Array<br><textarea name="data_array"></textarea></p>
    <input type="submit" value="Submit User Data">
</form>

<h2>List User Accounts</h2>
<table width="100%" cellpadding=10 cellborder=1>
{{#if msg includeZero=true}}
    <span class='msg'>{{ msg }}</span>
{{/if}}
{{#each users}}
        <tr>
        <td><a href="/single/{{ id }}">{{userName}}</a></td>
        <td>{{eth_address}}</td>
        <td>{{data_array}}</td>
        </tr>
{{/each}}
</table>
<p>Amount (Send Limit 100)<br><input type="text" name="amount"></p>
        <p>To Address<br><input type="text" name="toAddress"></p>
        <button id="send-token" name="submit">Send Token</button>
<div class="">Acct Balance: <span id="balance"></span></div>

    <script>

        if (typeof web3 !== 'undefined') {
          web3 = new Web3(web3.currentProvider);
        } else {
          // set the provider you want from Web3.providers
          web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/16aa8f4c7efc4ad3844ea4d8d1701554"));
        }

        var gasDefault = 2000000;
        var fromAddress = '0x70362Ff8842c15B1c2ECD663BD7cCED0E366f0D6';
        var fromPrivate = "censored";
        web3.eth.defaultAccount = fromAddress;

        var contractABI = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}];

        var contractAddress = "0x302cC16165B3AE82643aC62a8b77bA48b1f03fe1";

        var daVinciContract = web3.eth.contract(contractABI);
        var daVinci = daVinciContract.at(contractAddress);
        var result = daVinci.balanceOf("0x70362Ff8842c15B1c2ECD663BD7cCED0E366f0D6",function(err, hash) {
                            if (!err)
                            $("#balance").text(hash.c[0]);
                            else
                            console.log(err);
                            });

        // toAddress = 0x1E116fD224b9185dB17DC47AC32CA30A141F67aC


        $(document).ready(function(){
            $("#balance").text(result); // '0x25434534534'


            // SEND TOKEN

            $("#send-token").click(function(){

                var amount = $("[name=amount]").val();
                var toAddress = $("[name=toAddress]").val();
                alert(toAddress);
                if (toAddress !=='') {


                    if (amount !=='') {
                        if (amount > 100) {
                            alert("Too much to send");
                        } else {
                            // INTITIATE TRANSACTION
                            var count = web3.eth.getTransactionCount(fromAddress,function(err, hash) {
                            if (!err)
                            console.log(hash);
                            else
                            console.log(err);
                            });

                            // CREATE RAW TRANSACTION
                            var rawTransaction = {
                                "from": fromAddress, // Main account sending from
                                "nonce": web3.toHex(count),
                                "gasPrice": "0x04e3b29200",
                                "gasLimit": "0x7458",
                                "to": contractAddress,
                                "value": "0x0",
                                "data": daVinci.transfer.getData(toAddress, amount, {from: fromAddress})
                            };
                            var privKey = new Buffer(fromPrivate, 'hex');
                            var tx = new Tx(rawTransaction);

                            tx.sign(privKey);
                            var serializedTx = tx.serialize();

                            web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
                            if (!err)
                            console.log(hash);
                            else
                            console.log(err);
                            });

                        }
                    } else {
                        alert("Amount empty");
                    }
                }

            });

        });

    </script>

app.js

    var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');

var indexRouter = require('./routes/index');

var app = express();

// LOGGING
var logger = require('morgan');

// BODY POST PARSER
var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Indexcontroller.js

    const express = require("express");
const con = require("../conn.js");

exports.indexView = (req, res) => {

    // GET USER ACCOUNT LIST


    var sql = "SELECT * FROM users";
    var users = [];

    con.query(sql, function (err, result) {
    if (err) throw err;

        var users = result;

        res.render('index', {
        title: 'Home Page',
        users: users
        });

    });






};

1 个答案:

答案 0 :(得分:1)

显然,您对代码不了解。模板文件中<script>标记中的Javascript在浏览器中运行。浏览器从您的node.js服务器下载呈现的HTML,然后解析该文件,然后运行浏览器中<script>标签中的Javascript。

浏览器中没有Buffer对象。

导致该错误的代码显然是设计为在node.js(而不是在浏览器中)中运行的,或者您缺少一些必须添加到浏览器以使其运行的环境,或者根本就没有设计过在其中运行浏览器。

您可能需要将该代码移至服务器,然后使用Ajax调用从您的网页访问服务器,以要求服务器运行该代码并返回结果。然后,有问题的代码将在设计运行的node.js以及内置的Buffer对象中运行。