Возникли проблемы с доступом к массиву вне цикла в узле

#node.js #ejs

#node.js #ejs

Вопрос:

Я пытаюсь загрузить список из psql, а затем передать его в шаблон и ejs. Я вполне уверен, что это результат асинхронного характера выполняемого кода, он создает переменную, заполняет ее, но затем, когда мы выходим из цикла, он смотрит на голую переменную.

Список учетных записей возвращается [], когда я выхожу из цикла. Как мне сделать список учетных записей доступным вне цикла, чтобы я мог отправить его в файл ejs?

 const pool = new pg.Pool(config);

app.get('/', (req, res, next) => {

    //query the database
    const query = {
        name: "getDB",
        text: "select * from smartsneakers",
    }

    //init the accountList to store information
    var accountList = [];
      
    pool.query(query, (err,res) => {
        if (err) {
            res.status(500).json({"status_code": 500, "status_message": "internal server error"});
        } else {
                //loop to check each row
                for (let i = 0; i < res.rows.length; i  ) {
                    accountList.push(res.rows[i]);
                    //console.log(accountList)
                }
        } 
    });


    //console.log(accountList); will return [] at this level

    //close connection
    pool.end();

    //render the page
    res.render("ejs/index", {
        title: "campaign management",
        account: accountList, 
    });
});
 
var server = http.createServer(app);

server.listen(3000, function(){
    console.log('listening on port', 3000);
});
  

Комментарии:

1. Кто-нибудь разместит сообщение об ошибке, закройте пожалуйста; Я на мобильном телефоне.

Ответ №1:

По умолчанию он возвращает promise значение so, поэтому вы должны написать свой render после завершения запроса следующим образом

 pool
  .connect()
  .then(client => {
    return client
      .query('SELECT * FROM users WHERE id = $1', [1])
      .then(res => {
        client.release()
        // you could add you render here
        
      })
      .catch(err => {
        client.release()
        console.log(err.stack)
      })
  })

  

вы можете прочитать больше в документах