【问题标题】:node.js: HTML form hangs after submit when inserting data into PostgreSQL databasenode.js:将数据插入 PostgreSQL 数据库时,HTML 表单在提交后挂起
【发布时间】:2015-04-28 15:55:59
【问题描述】:

我最近使用Express 设置了node.js,并使用Jade 创建了一个简单的HTML 表单。表格是将数据插入PostgreSQL 数据库。问题是,当我在表单上按下提交时,所有内容都插入到数据库中,但HTML 表单只是挂起/徘徊,并且在某些时候它以No data received, ERR_EMPTY_RESPONSE 停止。有时它还会插入两次数据。我猜这是因为服务器端没有返回响应,但我看不到如何(我是node.js 的新手)。

表单有action="add_device",它被路由到routes/add_device.jsadd_device.js 看起来像这样:

var express = require('express');
var router = express.Router();

router.get('/', function(request, response, next) {
    res.send('Nothing to see here. Move along.');
});

router.post('/', function(request, response, next) {
    var db      = require('../public/javascripts/db/insert');
    var result  = db.insertDevice(request, response);
    return result;
});

module.exports = router;

我的db 模块中的insertDevice 函数如下所示(使用module.exports 导出):

// Insert new QA device. Data arriving as a request from a HTML form.
insertDevice: function (request, response) {

    // Input that is verified in the HTML form.
    // Convert to proper format for PostgreSQL query.
    var name        = '\'' + request.body.name          + '\'';
    var ip_address  = '\'' + request.body.ip_address    + '\'';
    var os          = '\'' + request.body.os            + '\'';

    // Input that needs to be verified. Prepare for PostgreSQL query.
    var mac_address;
    var os_version;
    request.body.mac_address == ""  ?   mac_address = 'NULL'    :   mac_address = '\'' + request.body.mac_address   + '\'';
    request.body.os_version == ""   ?   os_version  = 'NULL'    :   os_version  = '\'' + request.body.os_version    + '\'';

    var pg = require('pg');             // PostgreSQL module.
    var td = require('./table_data')    // Database constants.

    var client = new pg.Client(request.app.get('postgreConnection'));
    client.connect(function(err) {
        if (err) {
            return console.error('Could not connect to postgres', err);
        }

        var QUERY = "INSERT INTO " + td.QA_DEVICES.TABLE_NAME + "(" +
                    td.QA_DEVICES.COLUMN_NAME           + ", " +
                    td.QA_DEVICES.COLUMN_MAC_ADDRESS    + ", " +
                    td.QA_DEVICES.COLUMN_IP_ADDRESS     + ", " +
                    td.QA_DEVICES.COLUMN_OS             + ", " +
                    td.QA_DEVICES.COLUMN_OS_VERSION     + ") VALUES(" +
                    name        + ", " +
                    mac_address + ", " +
                    ip_address  + ", " +
                    os          + ", " +
                    os_version  + ");";

        client.query(QUERY, function (err, result) {
            if (err) {
                return console.error('Error running query: ' + QUERY, err);
            }

            console.log('Query performed: ' + QUERY);
            client.end();
        });
    });

}

“执行的查询” 始终记录到控制台并将数据插入数据库,但表单仍然挂起。我的问题是:

  1. 是服务器没有响应导致表单挂起吗?
  2. 如何将响应“发回”到前端?
  3. 前端插入数据库后是否可以路由到另一个页面?最佳做法是什么?

【问题讨论】:

    标签: javascript html node.js postgresql


    【解决方案1】:
    1. 是的,您的请求没有收到响应,所以它被挂起。

    2. 为了发送响应,您可以在收到请求时发送一​​个盲确认(这不依赖于查询的成功,可能是不好的做法),或者您可以发送它回调。

    client.query(QUERY, function (err, result) {
                if (err) {
                    // response.json({status: 'error'});
                    response.write('Error');
                    return console.error('Error running query: ' + QUERY, err);
                } else {
      
                    // You can send json here too
                    // response.json({status: 'success'});
                    response.write('Success');
    
                }
    
                console.log('Query performed: ' + QUERY);
                client.end();
            });
    1. 如果您想转到另一个页面,只需在客户端解析传入的响应并进行重定向。使用 json 是执行此操作的好方法。您也可以在服务器端执行 response.redirect(url),而不是发回数据。玩得开心

    【讨论】:

    • 是的,这是有道理的。感谢您提供良好的答案,并提供进一步良好实践的指导。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2015-07-04
    • 2016-07-23
    • 1970-01-01
    • 2017-06-07
    • 2015-05-15
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多