2017-09-15 1 views
1

nodejs 함수에서 반환 값을 게시 요청에 보낼 수 없습니다. 나는 generateHash에서 "응답"을 필요로하고 위의 게시 요청에 "hashVal"에nodejs 함수에서 값을 반환 할 수 없습니다.

app.post('/filehash', function(req, res) { 
    var filePath = req.body.filePath; 
    if (!filePath) { 
     res.json(getErrorMessage('\'filePath\'')); 
     return; 
    } 
    var hashVal = fileHash.generateHash(filePath); 
     logger.info('hashVal---->>>> '+hashVal); 
    res.send(hashVal); 
}); 


var generateHash = function(filePath) { 
var algo = 'md5'; 
    var shasum = crypto.createHash(algo); 
    var response = ''; 
    var s = fs.ReadStream(filePath); 
    s.on('data', function(d) { shasum.update(d); }); 
    s.on('end', function() { 
    var d = shasum.digest('hex'); 
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n'); 
    console.log(d); 
    response=d; 
    return response; 
    }); 
}; 

답변

1

콜백을 사용합니다. 이렇게 결과를 반환 할 수 없습니다. 당신은 당신의 코드를 찾고 콜백

app.post('/filehash', function(req, res) { 
    var filePath = req.body.filePath; 
    if (!filePath) { 
     res.json(getErrorMessage('\'filePath\'')); 
     return; 
    } 
    fileHash.generateHash(filePath, function(hashVal){ 
     logger.info('hashVal---->>>> '+hashVal); 
     res.send(hashVal); 
    }); 

    }); 


var generateHash = function(filePath, cb) { 
    var algo = 'md5'; 
    var shasum = crypto.createHash(algo); 
    var response = ''; 
    var s = fs.ReadStream(filePath); 
    s.on('data', function(d) { shasum.update(d); }); 
    s.on('end', function() { 
    var d = shasum.digest('hex'); 
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n'); 
    console.log(d); 
    response=d; 
    return cb(response); 
    }); 
}; 
0

추가 콜백 generateHash 기능을 저장하고 end 이벤트를에 전화를 걸 :

var generateHash = function(filePath, cb) { 
    ... 
    s.on('error', function(err) { 
    cb(err); 
    }); 
    s.on('end', function() { 
    ... 
    cb(null, response); 
    }); 
}); 

컨트롤러 :

:
app.post('/filehash', function(req, res) { 
    ... 
    fileHash.generateHash(filePath, (err, hashVal) => { 
    if (err) { 
     return res.status(500).send(err); 
    } 
    logger.info('hashVal---->>>> '+ hashVal); 
    res.send(hashVal); 
    }); 
}); 

또 다른 은 현대적인 방법은 약속을 사용하는 것입니다

컨트롤러 :

app.post('/filehash', function(req, res) { 
    ... 
    fileHash 
    .generateHash(filePath) 
    .then(hashVal => { 
     logger.info('hashVal---->>>> '+hashVal); 
     res.send(hashVal); 
    }) 
    .catch(err => res.status(500).send(err); 
}); 
0

당신은 그것으로 인해의 비동기 자연에 Node.js를 이러한 방법을 반환 할 수 없습니다. 당신이 할 수있는 한 가지 generateHash는 비동기 기능입니다

app.post('/filehash', function(req, res) { 
    var filePath = req.body.filePath; 
    if (!filePath) { 
     res.json(getErrorMessage('\'filePath\'')); 
     return; 
    } 
    fileHash.generateHash(filePath,function(err,hashVal){ 
     logger.info('hashVal---->>>> '+hashVal); 
     res.send(hashVal); 
    }); 
}); 


var generateHash = function(filePath,callback) { 
var algo = 'md5'; 
    var shasum = crypto.createHash(algo); 
    var response = ''; 
    var s = fs.ReadStream(filePath); 
    s.on('data', function(d) { shasum.update(d); }); 
    s.on('end', function() { 
    var d = shasum.digest('hex'); 
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n'); 
    console.log(d); 
    response=d; 
    callback(null,response); 
    }); 
}; 
0

에 반환해야합니다, 당신은 filehash 객체의 내부 속성으로하지 generateHash라는 변수에 함수를 정의했다.

에 한번 교체 :

var hashVal = fileHash.generateHash(filePath); 

var hashVal = generateHash(filePath); 

관련 문제