2017-10-06 152 views
0

我是一个Node.js新手,试图通过访问我写入的外部文件中的函数load_blocks()将数据发送回浏览器,并将其与res.send()一起调用。Node.js无法将字符串传入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(),这意味着读线然后将它们作为文本返回。但是,当我打开我的页面时,<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标签读取,这是我现在通过的文件中的数据?出了什么问题?

回答

2

load_blocks()是异步的。它不会返回完成的字符串,因为该函数中的readline代码是异步的,并且在load_blocks()返回时尚未完成,因此return_string在返回时尚不具有您想要的值。

这是Javascript中一个经典的异步编程问题。你的load_blocks函数需要返回一个promise或者在它完成工作时调用一个回调函数,并且调用者必须使用返回的promise或callback来获得最终结果。

有关返回一个异步值了很多详细信息,请参阅各种选项这里提供: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()到返回一个承诺,当你有最终的价值时就会解决。

您为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); 
       } 
      }); 
     }); 
    } 
}; 
+0

感谢你为这个优秀的答案 –

+0

@OscarChambers - 这错误意味着你没有实现你的一些异步代码正确,还企图将两个响应发送到同样的要求。我必须看到正在执行此操作的实际代码才能知道要推荐的内容。 – jfriend00