【问题标题】:res.end(result) doesn't display the result on my web pageres.end(result) 没有在我的网页上显示结果
【发布时间】:2017-11-15 11:34:31
【问题描述】:

调用res.end(result) 不会在我的网页上显示结果,它只是在我调用console.log('result ' + result) 时显示在控制台上。

这是我的 nodejs 代码:

 const express = require('express')
    const app = express()
    var url = require('url');
    var Web3 = require('web3');

app.get('/', function(req, res) {
            res.writeHead(200, {
                'Content-Type': 'text/html'
            });

            if (typeof web3 !== 'undefined') {
                web3 = new Web3(web3.currentProvider);
            } else {
                web3 = new Web3(new Web3.providers.HttpProvider("http://54.00.00.00:3010"));
            }

            if (web3.isConnected()) {

                var abi = JSON.parse('[{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getData","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Achats","outputs":[{"name":"aName","type":"bytes32"},{"name":"aId","type":"uint256"},{"name":"aDate","type":"bytes32"},{"name":"aValue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"name","type":"bytes32"},{"name":"iid","type":"uint256"},{"name":"date","type":"bytes32"},{"name":"value","type":"uint256"}],"name":"setData","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]');
                TestContract = web3.eth.contract(abi);
                contractInstance = TestContract.at('0xc08f46fff9fcf082a0d1cebbcc464ca141d2b7d7');

                if (q.opt == 'get' && typeof q.index != "undefined") {
                    contractInstance.getData.call(parseInt(q.index), {
                        from: '0x3e10889Ef5066C1428ECaf8580aD4EFd50F8Cf7B'
                    }, function(error, result) {
                        console.log('error ' + error);
                        console.log('result ' + result);
                        res.end(result);
                    });
                }
            }
        }
        app.listen(3000, function() {
            console.log('Yep... on 3000 !')
        })

我一直在函数“getData”内外尝试“res.end(result)”,但同样的问题,网页上没有显示任何内容

【问题讨论】:

    标签: javascript node.js express url-routing


    【解决方案1】:

    这是一个困难,但我想我明白了。

    请参阅hereherehere,了解如何在 Express 中设置标头以及如何在 Express 中发送数据。您正在将 Node 的 res/req 与 Express 的 res/req 混合使用。不要那样做。 Express 包装了节点对象并且工作方式略有不同,例如它会为您处理正确的标题。

    这就是你正在做的:使用writeHead(),你设置标题。然后,您使用带有错误参数类型的.end()res.end()will only accept strings or Buffers 作为数据(第一个错误)。当您更改为 .send() 时,该方法会负责设置正确的标题,但您已经手动完成了,因此您设置了两次标题并且您不应该这样做,所以 boom(第二个错误)。

    解决办法是去掉这个:

    res.writeHead(200, {
        'Content-Type': 'text/html'
    });
    

    ...然后使用res.send(result) 发送您的数据。

    作为旁注,我希望喜欢知道您是如何运行您的应用程序而没有收到错误日志的,因为当我尝试构建一个可验证的示例时,它们到处都是。详细的错误日志有时比创建它们的代码更有价值。这是“有时”之一。

    【讨论】:

    • 非常感谢您的帮助,终于成功了。
    【解决方案2】:

    你能试试下面的方法吗:

        res.write(result);
        res.end()
    

    res 是stream,所以你需要将结果写入res 然后end

    祝你有美好的一天!

    【讨论】:

    • 您收到了什么结果?
    • 在控制台上:错误:结束后写入。在网页上:什么都没有!
    • 通常是因为结果太大,可能你应该尝试以下方法来确定:return new Promise.resolve(() => { res.write(result); }) .then(() => { res.end(); });
    【解决方案3】:

    好吧,您只有在 web3.isConnected()q.opt == 'get' && typeof q.index != "undefined" 时才会回复。可能是其中一个条件不成立。

    【讨论】:

    • 结果显示在控制台上,说明这两个条件有效!
    • 你能告诉我们这个打印结果是什么样子的吗?我会尝试重现。
    • SPAN>
    • 函数getData读取区块链上智能合约插入的数据
    • 我创建了一个最小版本并成功返回了结果。 1. 你在 res.end() 之后有没有控制台报错?如果是这样,请发布 2. 尝试 res.send 而不是 res.end 3. 你使用的是什么版本的节点?
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2013-02-25
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多