【问题标题】:page renders before getting all the values sorted在对所有值进行排序之前呈现页面
【发布时间】:2019-03-28 02:47:02
【问题描述】:

我认为渲染是在搜索文件上的字符串之前进行的,我尝试了不同的方法,但似乎无法正常工作。任何帮助将不胜感激。我是nodejs的菜鸟。我试图获取用户的 id 并查询并获取所有数据,然后查看他是否在给定的任何列表中并最终呈现页面。

    const j = [];
let name = '';
const filename = [];
var ext = '';

module.exports = function(app, express) {

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

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

var cusid=req.body.cusid;

var insertQuerys = "SELECT * FROM customer WHERE cusid=? ORDER BY rowid DESC LIMIT 1";

     connection.query(insertQuerys,[cusid],
      function(err, rows){ 
        rows.forEach( (row) => {
          name=row.fncus;

});

fs.readdir('./views/iplist', function(err, files) {
    if (err)
        throw err;
    for (var index in files) {

        j.push(files[index])
    }

    j.forEach(function(value) {

var k = require('path').resolve(__dirname, '../views/iplist/',value);

fs.exists(k, function(fileok){
  if(fileok) {
        fs.readFile(k, function(err, content) {
           if (err) throw err;
            if (content.indexOf(name) > -1) {
                ext = path.extname(k);
                filename.push(path.basename(k, ext));
            }
        });
      }
      else {
        console.log(" FileNotExist ");
      }
    });
 });
}); 

            console.log(filename);
            res.render('cusdetails.ejs', {rows: rows, user:req.user , aml: filename });
});
     })

【问题讨论】:

  • 您可以使用Promise 和/或async/await 来实现您想要做的事情。像这个ordering 问题。 stackoverflow.com/a/55361774/7185241
  • @naga-elixir-jar 你能帮我调整一下代码吗?理解起来真的很有帮助。我已经尝试了几个小时,但仍然无法掌握它。
  • 你使用哪个包进行sql查询?
  • mysql 是我正在使用的一个

标签: node.js


【解决方案1】:

您可以创建简单的Promise 包装器,然后在async/await 函数中使用它来暂停执行直到resolved

// use mysql2 package as it provides promise, less work to write promise wrappers
const mysql = require('mysql2/promise');

// create the connection to database
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  database: 'test'
});

// sample wrapper
function some(k) {
    // more advisable to have local variables, why do you need this to be array?
    var filename = [];
    return new Promise((resolve, reject) => {
      // doing this is also not recommended check nodejs documentation **fs.exists** for more info
      fs.exists(k, function(fileok){
        if(fileok) {
          fs.readFile(k, function(err, content) {
            if (err) reject(err);
            if (content.indexOf(name) > -1) {
              ext = path.extname(k);
              filename.push(path.basename(k, ext));
              resolve(filename)
            }
          });
        }
        else {
          // reject(new Error("FileNotExist"))
          console.log(" FileNotExist ");
        }
      });
    })
  }

// note the use of async
app.post('/cusdetails', isLoggedIn, async function (req, res) {

  var cusid=req.body.cusid;

  var insertQuerys = "SELECT * FROM customer WHERE cusid=? ORDER BY rowid DESC LIMIT 1";

    // using await to pause excution, waits till query is finished
    const [rows] = await connection.query(insertQuerys,[cusid])
    rows.forEach( (row) => {
      name=row.fncus;

  });

  // then you can
  var result = await some(k)
  ...

但是请注意,这样你就失去了concurrent 执行的优势,因为它是一种阻塞。如果一个调用的结果没有用在另一个调用中,可以在parallelawait中执行结果来实现排序

const [rows] = connection.query(insertQuerys,[cusid])

var result = some(k)

console.log(await rows) // do something
console.log(await result) // do something

【讨论】:

    【解决方案2】:

    JavaScript 是异步的。这意味着如果您有一个带有回调的函数(即您的查询),则回调将在未知时间异步调用,同时执行其他代码。

    您需要查看一些如何处理回调的教程,以正确理解它。另一种方法是使用async/await 和/或承诺。

    基本上,如果你采取以下代码:

    console.log("this will print first");
    
    setTimeout(function () {
        console.log("this will print last");
    }, 1000);
    
    console.log("this will print second");
    

    如果运行上面的代码,顶层是同步执行的,所以,它先调用console.log,然后再执行setTimeout,是同步的。它设置了一个超时,然后说“我准备好了”,然后代码继续到另一个console.log。 1 秒(1000 毫秒)后,执行setTimeout 函数中的回调,然后才调用console.log。你不能让其余的代码这样等待,你需要重构你的代码或者读入 Promise。

    【讨论】:

    • 您好,谢谢,但我如何计算超时时间?更多的文件很难得到正确的时间?
    • 这不是我回答的重点。超时是一个示例,它向您展示了回调不是按照您编写它们的顺序调用的。PHP 是一种语言,其中每一行都在另一行之前执行,而 JavaScript 不是。您需要重组代码,加载文件后继续执行。您可以通过将代码放在另一段代码的回调中来做到这一点,但这会创建callback hell
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多