Node.js 无法将字符串传递给 res.send();不明确的

Node.js cannot pass string into res.send(); Undefined

我是一个 Node.js 新手,试图通过访问我编写的外部文件中的函数 load_blocks() 将数据发送回浏览器,并使用 res.send() 调用它。

我有两个简单的文件:

第一个是典型的app.js文件:

const  express = require('express');
const app = express();

//import my file
const blockchain = require('./load_blockchain.js');

app.get('/', function(req, res){
        res.send('<h3>' + blockchain.load_blocks() +  '</h3>');
});


app.listen(3000, function(){
        console.log('Example app listening on port 3000!');
});

load_blockchain.js

这个文件有一个函数 load_blocks() 用来读取文件的行然后 return 它们作为文本。但是当我加载我的页面时,<h3> 标签显示为 undefined

var fs = require('fs');
var readline = require('readline'); 

module.exports = {
        load_blocks: function (){
        //Load The File
        var return_string = "";
        var rd = readline.createInterface({
                input:fs.createReadStream('/home/blockchain_data/1.dat$
                output: process.stdout,
                console: true
        });

        rd.on('line', function(line){
                console.log(line);
                return_string += line;
        });

        return return_string;
        }
};

h3 标签不应该读取我现在传递的文件中的数据吗?出了什么问题?

load_blocks() 是异步的。它没有 return 完成的字符串,因为该函数中的 readline 代码是异步的,并且在 load_blocks() returns 时尚未完成,因此 return_string 还没有值你想要 return.

这是Javascript中经典的异步编程问题。您的 load_blocks 函数在完成工作时需要 return 承诺或调用回调,并且调用者必须使用该 returned 承诺或回调来获得最终结果。

有关 returning 异步值的更多信息,请参阅此处提供的各种选项:How do I return the response from an asynchronous call?

您可以将代码更改为如下内容:

app.get('/', function(req, res){
        blockchain.load_blocks().then(val => {
            res.send('<h3>' + val +  '</h3>');
        }).catch(err => {
            console.log(err);
            res.status(500).end();
        });
});

然后,将 blockchain.load_blocks() 更改为 return 一个在您获得最终值时解析的承诺。

您为 load_blocks 显示的代码似乎只是在读取整个文件。我不明白您逐行阅读它的任何原因。如果你只想读取整个文件,你可以只使用fs.readFile()来读取整个文件。

 module.exports = {
     load_blocks: function() {
         return new Promise((resolve, reject) => {
             fs.readFile('/home/blockchain_data/1.dat$', function(err, data) {
                 if (err) {
                    reject(err);
                 } else {
                    resolve(data);
                 }
             });
         });
     }
 };