【问题标题】:Get variable out from function which is calling export.modules node.js从调用 export.modules node.js 的函数中获取变量
【发布时间】:2022-01-15 18:58:12
【问题描述】:

在文件 users.js 中,我想从 randomCode() 中获取 code 以分配给 result 并在整个端点 '/login' 中使用它。

randomCode.js

const crypto = require('crypto')

const randomCode = (callback) =>{
    crypto.randomInt(100000, 999999, (err, n) => {
        if (err) throw err;
        callback(n);
    });
}
    
module.exports = randomCode

users.js

require('dotenv').config()
const express = require('express')
const router = express.Router()
const randomCode = require('../controllers/randomCode')


router.get('/login', async (req, res, next)=>{
    try{
//-----------------------------------------------------
        randomCode((code) => {
          console.log(code,'code')
        })
//-----------------------------------------------------
        return res.send('ok')
    }
    catch(error){
        res.send(error)
    }
})

module.exports = router;

我尝试使用await,但没有结果。

router.get('/login', async (req, res, next)=>{
    try{
//------------------------------------------------------
        const result = await randomCode((code) => {
          console.log(code,'code')
        })
        console.log(result)
//------------------------------------------------------
        return res.send('ok')
    }
    catch(error){
        res.send(error)
    }
})

【问题讨论】:

  • 为什么不直接使用 randomCode 作为辅助方法而不是控制器? crypto.randomInt 永远不会抛出错误,因此您可以跳过回调,只需返回代码并像这样使用它: const code = randomCode();但是,我真的没有看到您的代码有问题,控制台打印的是什么?
  • 我在控制器中插入randomCode()的原因是:找出:)我以前遇到过这种“问题”,但通常我跳过它并将功能从控制器移动到其他位置。
  • 这完全公平,对你有好处!我尝试在 javascript 文件中复制它,这两个函数似乎都工作正常,所以问题一定出在其他地方。打印您的案例的 console.log 是什么?
  • localhost:8000-------- 监听的示例应用程序已连接数据库.----- undefined-------- 568350 代码

标签: javascript node.js express


【解决方案1】:

会有不同的方法(尤其是crypto.randomInt 可能是 同步调用),但我知道您对如何 从异步函数中获取值,所以我会回答:

const randomCode = function(){
  return new Promise((resolve, reject) => {
    crypto.randomInt(100000, 999999, (err, n) => {
      if( err ){
        reject( err );
      } else {
        resolve( n );
      }
    });
  });
}
router.get('/login', async (req, res, next)=>{
  try{
    const code = await randomCode();
    console.log(code)
    return res.send('ok')
  }
  catch(error){
    res.send(error)
  }
})

如果由于某种原因无法更改 randomCode() 函数,则需要将其包装到 Promise 中,例如:

const randomCodePromise = function(){
    return new Promise((resolve, reject) => {
        randomCode((code) => {
            resolve( code );
        })
    });
}

(显然然后使用await randomCodePromise() 而不是await randomCode()

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2018-05-24
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多