【问题标题】:ExpressJS - Call an outer function in router.get and render its dataExpressJS - 在 router.get 中调用外部函数并渲染其数据
【发布时间】:2018-04-30 03:48:42
【问题描述】:

我需要调用函数以便将 mysql 查询数据呈现到我的视图中,而不是在 router.get 中使用查询函数

如何在router.get 中调用function(),以便通过EJS 或任何其他模板引擎呈现其查询输出?

index.js

function fdb(mypar) {
    obj = {}
    con.query(mypar, (err, rows) => {
        if (err) throw err
        obj = rows[0]
        console.log(obj)
        //rows data fetching OK using stored procedure get_all_1 when route '/' is called
    })
}

/* GET home page. */
router.get('/', function(req, res, next) {
    fdb('CALL get_all_1')
    console.log(obj) // {}

    to_render = { print: obj } 
    console.log(to_render) // { print: {} }

    res.render('index', to_render); 
    //it obviously cannot render anything
    //GET / 500 
});

index.ejs

<% print.forEach(function (qdata) { %>
    <tr>
        <td>
            <%= qdata.name %>
        </td>
        <td>
            <%= qdata.location %>
        </td>
    </tr>
<% }) %>

当我尝试通过router.get 中的fdb() 函数调用obj 时,我以某种方式理解它超出了范围,但不知道如何操作该范围。

【问题讨论】:

  • @Cadmos 如果能解决您的问题,请标记答案。
  • @jfriend00 这不是他问题的答案。是使用let / const 还是旧的var 是他的决定,与他的问题完全无关。你居然叫他自己解决!
  • @Vasikos - 如果我认为这是对这个问题的回答,我会把它放在一个实际的答案中。 OP 在基于服务器的异步代码中使用未声明的变量。这是灾难的秘诀。错误的代码可能会导致错误,应使用varletconst 声明它们。我在教育他们应该解决这个问题。我没有说变量声明问题是一个答案。另一方面,我引用的链接确实解释了 fdb() 的问题以及如何返回他们需要做的异步结果。
  • @Vasikos - 这是 cmets 在这里要做的一件事 - 指出关于代码的其他事情,这些事情没有被视为解决方案,但是 OP 应该知道的其他事情。而且,如果他们继续在异步代码中使用未声明的(隐式全局变量)以这种方式编程,他们的代码将充满错误。

标签: javascript mysql node.js express ejs


【解决方案1】:

这样做。您可以为此使用回调函数。

function fdb(mypar, callback) {
    con.query(mypar, (err, rows) => {  
         callback(err,rows);

    })
}

/* GET home page. */
router.get('/', function(req, res, next) {
    fdb('CALL get_all_1',function(err,obj){

    if (err) throw err;
    obj = rows[0]
    console.log(obj);
    to_render = { print: obj } 
    console.log(to_render) // { print: {} }
    res.render('index', to_render);
  });
});

【讨论】:

    【解决方案2】:
    function fdb(mypar) {
      return new Promise((resolve) => {
        obj = {}
        con.query(mypar, (err, rows) => {
          if (err) throw err
          obj = rows[0]
          console.log(obj)
          resolve(obj);
        })
      });
    }
    
    /* GET home page. */
    router.get('/', async function(req, res, next) {
      let obj = await fdb('CALL get_all_1')
      console.log(obj)
    
      to_render = { print: obj } 
      console.log(to_render)
    
      res.render('index', to_render); 
    });
    

    【讨论】:

    • 还需要修复未声明的变量,这样多条路由就不会通过共享全局而互相攻击。
    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2017-04-18
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多