javascript - Node js 使用数据库中的数据进行渲染
问题描述
我有这样的 index.js
var express = require('express');
var app = express();
var list = require('./data').list;
// [...]
app.get('/', function (req, res) {
res.render('home',{
list: list,
});
});
和 data.js 应该向数据库服务器询问数据
const { Pool, Client } = require('pg')
var list = [];
const pool = new Pool({
connectionString: '...',
})
pool.query('select * from list', (err, res) => {
if(res){
list = res.rows;
}
pool.end()
})
exports.list = list;
问题是当页面被渲染时,列表是空的,并且数据库调用发生在页面渲染之后。有没有办法避免这种情况?
解决方案
pool.query
是一个异步函数。您可以通过多种不同方式解决您的问题,我会将您的数据库逻辑转换为返回承诺的函数。然后将你的 HTTP 处理程序变成一个async
处理程序,以及await
来自“data.js”的“数据承诺”。像这样:
// index.js
const express = require('express');
const app = express();
const { getList } = require('./data');
app.get('/', async (req, res) => {
res.render('home', {
list: await getList(),
});
});
// data.js
const { Pool } = require('pg');
exports.getList = () => new Promise((resolve) => {
const pool = new Pool({
connectionString: '...',
});
pool.query('select * from list', (err, res) => {
if (res) {
resolve(res.rows);
}
pool.end();
});
});
推荐阅读
- python - 在 Maya python 中,即使场景中不存在对象(字符串的一部分)也运行命令
- laravel - 关系检索用户电子邮件
- javascript - 使用 Observables 为循环迭代中的每个元素分配从 api 调用接收的值
- node.js - 等到文件创建后在 node.js 中读取它
- sql - 临时视图和自动广播加入错误
- ios - 从 iOS 13 中的呈现模式拉动以刷新表格视图不起作用
- node.js - 如何将 Nuxt.js 部署到 Elastic Beanstalk?
- python - 子模板也可以在 django 中使用子模板吗?
- reactjs - 成功登录后,aws-amplify 不保留会话
- vue.js - 使用 Vuelidate 从父组件验证子组件