首页 > 解决方案 > 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;

问题是当页面被渲染时,列表是空的,并且数据库调用发生在页面渲染之后。有没有办法避免这种情况?

标签: javascriptnode.jspostgresqlexpress

解决方案


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();
  });
});

推荐阅读