Reputation: 3
I am making POST request to Nodejs server (with Express). In POST processing, I need to read data from 3 different files and push them in 3 array. However, it seems like that res.end() occurs before the reading finishes. Can someone help fix this please, this is my process function. (response = [[],[],[]])
app.post('/process_post', urlencodedParser, function(req, res) {
var readMail = readline.createInterface({
input : fs.createReadStream(path.join(process.cwd(), '/mail.txt'))
});
var readSubject1 = readline.createInterface({
input : fs.createReadStream(path.join(process.cwd(), '/subject1.txt'))
});
var readSubject2 = readline.createInterface({
input : fs.createReadStream(path.join(process.cwd(), '/subject2.txt'))
});
readMail.on('line', function(line) {
email.push(line);
});
readMail.on('close', function() {
// resolve(email);
console.log('finish mail');
});
readSubject1.on('line', function(line) { sub1.push(line) }).on('close', function() {
console.log('finish subject1');
});
readSubject2.on('line', function(line) { sub2.push(line) }).on('close', function() {
console.log('finish subject2');
});
var response = [email, sub1, sub2];
res.end(JSON.stringify(response));
});
Upvotes: 0
Views: 2299
Reputation: 1428
You have to use async process. Basically, callbacks are the key of many nodejs methods. I strongly suggest you learn promises, callbacks or some libraries like async . Anyway, I added promises to your code. You should return your res.end function inside then after promise.all.
var p1 = new Promise((resolve, reject) => {
readMail.on('line', function(line) {
email.push(line);
});
readMail.on('error', function(error) {
reject(error)
});
readMail.on('close', function() {
resolve(email);
});
});
var p2 = new Promise((resolve, reject) => {
readSubject1.on('line', function(line) {
sub1.push(line)
}).on('close', function() {
resolve(sub1);
}).on('error', function(err) {
reject(err);
})
});
var p3 = new Promise((resolve, reject) => {
readSubject2.on('line', function(line) {
sub2.push(line)
}).on('close', function() {
resolve(sub2);
}).on('error', function(err) {
reject(err);
})
});
Promise.all([p1, p2, p3])
.then(values => {
console.log('values [p1, p2, p3]');
res.end(values);
})
.catch(err => {
console.log(err);
})
Upvotes: 2