#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)
})
})
вы можете прочитать больше в документах