仅在从数据库服务器获得预期的响应后,才能如何响应前端请求?

问题描述

我正在尝试创建一个纯Node.js HTTP服务器,以将AngularJS前端连接到Postgres数据库。但是我无法向前端发送有效响应,因为在我可以从数据库服务器响应之前就已经发送了对前端的响应。

我的后端服务器代码如下。

const http = require('http');
const pg = require('pg');

let menu = [];

const headers = {
    'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': 'OPTIONS,POST,GET','Access-Control-Max-Age': 2592000,'Content-Type':'application/JSON',};

http.createServer((req,res) =>{

    client.connect();
    client.query('select * from menu;')
     .then(res => {
        for(row of res.rows) {
            let obj =   {
                            'name': row.name,'price': row.price,};
            menu.push(obj);
        }
        console.log(menu);
        client.end().then(()=>{console.log("Database disconnected");});
     }).catch(e => console.error(e.stack));
    console.log(menu);
    res.writeHead(200,headers);
    res.write(JSON.stringify(menu));
    res.end();
}).listen(3500,()=>{
    console.log("BackEnd Server online");
});

来自后端的控制台日志如下。请给我一个可能的解决方法。

BackEnd Server online
[]
[
  { name: 'Panner Butter Masala',price: 130 },{ name: 'Dosa',price: 80 },{ name: 'Roti',price: 40 },{ name: 'Pulka',price: 30 },{ name: 'Sambar vada',price: 70 }
]
Database disconnected

如您所见,在我可以从数据库获得响应之前,已经发送了对前端的响应。因此,我无法获取所需的数据。

解决方法

使用async / await等待响应,然后发送给客户端

const http = require('http');
const pg = require('pg');

let menu = [];

const headers = {
    'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': 'OPTIONS,POST,GET','Access-Control-Max-Age': 2592000,'Content-Type':'application/JSON',};

http.createServer(async (req,res) =>{

    client.connect();
    try {
        const res = await client.query('select * from menu;');
        for(row of res.rows) {
            let obj = {
                'name': row.name,'price': row.price,};
            menu.push(obj);
        }   
    } catch (e) {
        console.error(e.stack);
    }
    await client.end();
    console.log("Database disconnected")
    res.writeHead(200,headers);
    res.write(JSON.stringify(menu));
    res.end();
}).listen(3500,()=>{
    console.log("BackEnd Server online");
});

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...