NodeJs函数无法返回回调响应

时间:2019-04-25 06:20:51

标签: javascript node.js callback

我有一个实用程序功能,该功能是从文件系统中读取私钥,然后创建一个JWT令牌,
该代码能够读取文件并创建令牌,
但是它无法回调到调用函数,
也没有错误。

以下是功能代码-

let async = require('async');
let fs   = require('fs');
let path   = require('path');
let jwt = require('jsonwebtoken');

module.exports = {
    createToken
};

const TAG = '[COMMON-UTIL->';

function createToken(constants, payload, options, keyName, callback){
    const METHOD_TAG = TAG + 'createToken]->';

        async.waterfall([
            function(callback) {
                let keyPath = 'somePathHere';

                fs.readFile(keyPath, 'utf8', function(err, privateKey) {
                    if(err){
                        callback(err, null);
                    }
                    else{
                        callback(null, privateKey);
                    }
                });
            },
            function(privateKey, callback) {
                jwt.sign(payload, privateKey, options, function(err, token) {
                    if(err){
                        console.log(METHOD_TAG, err);
                        callback(err, null);
                    }
                    else{
                        callback(null, token);
                    }
                });
            }
        ],
        function(err, token) {
            if (err) {
                console.log(METHOD_TAG, err);
                callback(err, null);
            } 
            else {
                callback(null, token);
            }
        });
}

1 个答案:

答案 0 :(得分:0)

回调的词法范围问题。尝试如下所示更改代码:

const async = require('async');
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');

// const TAG = '[COMMON-UTIL->';
// const METHOD_TAG = TAG + 'createToken]->';

let createToken = (constants, payload, options, keyName, callback) => {
    async.waterfall([
        (async_callback) => {
            let keyPath = 'somePathHere';
            fs.readFile(keyPath, 'utf8', (err, privateKey) => {
                if (!err) {
                    async_callback(null, privateKey);
                } else {
                    async_callback(err);
                }
            });
        },
        (privateKey, async_callback) => {
            jwt.sign(payload, privateKey, options, (err, token) => {
                if (!err) {
                    async_callback(null, token);
                } else {
                    async_callback(err);
                }
            });
        }
    ], (err, token) => {
        callback(err, token);
    });
};


module.exports = {
    createToken
};

希望这可以解决问题。