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);
}
});
});
}
};
我是一个 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);
}
});
});
}
};