Node.js 如何从函数nodejs获取响应

Node.js 如何从函数nodejs获取响应,node.js,express,Node.js,Express,第二个函数中的console.log(lang)print未定义,它在第一个函数返回之前运行 如何修复它?问题之一是,您的getLang函数实际上没有返回任何内容,因此默认返回值将是未定义的。尽管如此,您仍然正确地指出,getLang进行异步函数调用,因此即使您从getLang返回转换函数的值,也不允许您成功地将变量分配给它,除非您: 将getLang包装在承诺中,并使用async/await,或 只需使用translate.detect的回调函数中的translation值 你可以用。承诺允许

第二个函数中的console.log(lang)print未定义,它在第一个函数返回之前运行


如何修复它?

问题之一是,您的
getLang
函数实际上没有返回任何内容,因此默认返回值将是
未定义的
。尽管如此,您仍然正确地指出,
getLang
进行异步函数调用,因此即使您从
getLang
返回转换函数的值,也不允许您成功地将变量分配给它,除非您:

  • getLang
    包装在承诺中,并使用async/await,或
  • 只需使用
    translate.detect的回调函数中的translation值
  • 你可以用。承诺允许您使用“.then”和“.catch”等待异步任务完成。当承诺成功解析时,调用“.then”。当承诺被拒绝时,调用“.catch”

    例如,您可以改为执行以下操作:

    const getLang = function (req) {
            translate.detect(req.body.phrase, function (err, res) {
                if (err) throw err;
                console.log(res);
                return res;
            });
    
    
    router.post('/addPhrases', (req, res) => {
        var lang = getLang(req);
        console.log(lang);
    })
    

    translate.detect
    是异步的。您必须
    console.log
    在它的回调中
    var lang=getLang(req)
    不会等待并返回语言。
    const getLang = function (req) {
        return new Promise((resolve, reject) => {
            translate.detect(req.body.phrase, (err, res) => {
                if (err){
                    reject(err);
                } else {
                    console.log(res);
                    resolve(res);
                }
            });
        });
    }
    
    
    router.post('/addPhrases', (req, res) => {
        var lang = getLang(req).then((lang) => {
            console.log(lang);
        }).catch((error) => {
            // handle error here
            throw new Error(error);
        });
    })