node.js:将数据插入到PostgreSQL数据库后,HTML表单提交后会挂起

我最近使用Express设置了node.js并使用Jade创build了一个简单的HTML表单。 表单是将数据插入到PostgreSQL数据库中。 问题是,当我按下提交表单时,所有内容都被插入到数据库中,但是HTML表单只是挂起/ No data received, ERR_EMPTY_RESPONSE ,并且在某些时候停止, 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(); }); }); } 

“执行的查询”始终logging到控制台和插入到数据库中的数据中,但表单仍处于挂起状态。 我的问题是:

  1. 是否缺乏服务器的响应,使表单挂起?
  2. 我怎样才能“回复”到前端?
  3. 插入数据库之后是否可以将前端路由到另一个页面? 最佳做法是什么?

  1. 是的,你的请求没有收到任何回应,所以它是挂起来的。

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

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