如何异步编写这段节点js代码

时间:2018-12-18 10:32:56

标签: node.js express ejs

我正在尝试处理邮寄请求。我希望这能获得发布请求,运行查询并获取一些数据,然后修改一些变量。然后呈现index.ejs文件以及更改后的变量。

一切正常。但是这里的问题是,它首先呈现页面,然后更新页面变量。 我如何以相反的顺序进行?我想也许我应该异步更改代码。我不知道该怎么做。

 app.post('/id',function (req, res) {

    // Run a mysql query

 con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', 
 function(error,results, fields) {
        if (error)
            throw error;

       //update some variables here

    });

// render the index.ejs file and an updated varible (ejs and express stuff) 

 res.render("index",{
changed_variable:changed_variable
   });

});

2 个答案:

答案 0 :(得分:0)

您只需将res.render放入查询成功回调中,如下所示:

con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', function(error,results, fields) {
  if (error)
    throw error;

    //update some variables here
    res.render("index",{ changed_variable:changed_variable });
})

但是建议的方法是使用async模块,请按照以下步骤安装它:

npm install --save async

使用async模块,您可以编写如下内容。

router.get('/id', function(req, res) {
  async.series([
    con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', function(error,results, fields) {
        if (error)
            throw error;

       //update some variables here

    })
  ],
  function(err, results) {
    res.render("index",{ changed_variable:changed_variable });
  })
})

答案 1 :(得分:0)

代码已经异步。如果要在查询完成处理后呈现页面,则应将呈现器放置在回调中。

@ComponentScan(basePackages = "put-your-base-package-name")