node.js + MySQL 和 JSON 结果 - 回调问题和对客户端没有响应

2023-12-27

我想使用 node.js 查询 mySQL 数据库并将结果作为 JSON 返回以在移动应用程序中使用。不幸的是,我的请求有点超时,服务器在 2 分钟内没有执行任何操作,直到日志文件显示我的请求console.log()-声明。

此外,回调不会返回任何结果。它只是空的。

// Check dependencies
var http = require('http');
// Create the http server.
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/
http.createServer(function(request, response) {
    // Attach listener on end event.
    request.on('close', function() {
        console.log('request');

        // run asynchronous 
        getSQL(function(err, result) {
            console.log('json:', result);
            response.writeHead(200, {
                'Content-Type' : 'x-application/json'
            });
            // Send data as JSON string.
            response.end(result);
        });
    });
}).listen(3000);

// Access MySQL via node-mysql
// https://github.com/felixge/node-mysql
function getSQL(callback) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host : 'localhost',
        user : 'user',
        password : 'pw',
        database : 'db',
        socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default?
    });

    connection.connect();
    var json = '';
    var query = 'SELECT * FROM test';
    connection.query(query, function(err, results, fields) {
        if (err)
            return callback(err, null);

        console.log('The result is: ', results[0]);

        // wrap result-set as json
        json = JSON.stringify(results);
    });
    connection.end();

    callback(null, json);
};

大约2分钟后输出:

$ node app.js
request
json:
The result is:  { test: 'avc' }
json2: [{"test":"avc"}]

基于我对整个 node.js 概念的基本理解,我的代码应该查询数据库(确实如此)并在通过回调函数完成后返回一个 json (显然没有),然后将其作为对客户端的响应(无法真正检查,因为 json 是空的)。

我想我犯了一个(或几个)重大错误。帮助和/或有用的链接将不胜感激。谢谢!

解决方案,感谢六氰化物

// Check dependencies
var http = require('http');
// Create the http server.
// reference: http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/

/***************
* Correction 1: Using the request.on('close', function()( ... )-listener isn't required anymore
***************/
http.createServer(function(req, res) {
    console.log('Receving request...');
    var callback = function(err, result) {
        res.writeHead(200, {
            'Content-Type' : 'x-application/json'
        });
        console.log('json:', result);
        res.end(result);
    };

    getSQL(callback);

}).listen(3000);

// Access MySQL via node-mysql
// https://github.com/felixge/node-mysql
function getSQL(callback) {
    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host : 'localhost',
        user : 'user',
        password : 'pw',
        database : 'db',
        socketPath : '/var/run/mysqld/mysqld.sock', // socket for communication from debian <-> client, seems not to be set correcly by default?
    });

    connection.connect();
    var json = '';
    var query = 'SELECT * FROM test';
    connection.query(query, function(err, results, fields) {
        if (err)
            return callback(err, null);

        console.log('The query-result is: ', results[0]);

        // wrap result-set as json
        json = JSON.stringify(results);

        /***************
        * Correction 2: Nest the callback correctly!
        ***************/
        connection.end();
        console.log('JSON-result:', json);
        callback(null, json);
    });
};

您正在遵循旧指南,该指南指示您等待请求close事件之前发送响应,但你实际上不再需要这样做。

发生的情况是您没有发送响应,因此您的客户端超时。只有直到客户端超时时close事件发生火灾。由于在您发送响应时客户端已断开连接,因此您在客户端上看不到任何内容,只能在终端中看到它。

要解决此问题,只需停止等待关闭事件并在调用请求处理程序时立即运行代码即可:

var http = require('http');
http.createServer(function(req, res) {
  getSQL(function(err, result) {
    res.writeHead(200, {
      'Content-Type' : 'x-application/json'
    });
    res.end(result);
  });
}).listen(3000);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node.js + MySQL 和 JSON 结果 - 回调问题和对客户端没有响应 的相关文章

随机推荐

  • 处理 Express 表单中的输入数组?

    假设我必须在同一页面上编辑一批相同类型的对象 jade form action method POST for each message id in messages ids input type text name message id
  • 如何删除Android searchview左侧的空间(不属于actionbar的一部分)?

    我在 android 应用程序中使用 searchview searchview 不是操作栏的一部分 我想删除搜索图标 搜索视图左侧的空格 我搜索了很多并收到了适用于作为操作栏一部分的搜索视图的答案 我尝试使用机器人 布局重力 机器人 重力
  • 为什么 const char* const & = "hello" 可以编译?

    我正在阅读一本书中的代码片段并发现 const char const a hello can compile const char a hello cannot 我所知道的是 在初始化引用时 数组到指针的转换不会发生 const char
  • graphstudio 中可用的引脚在代码中不存在

    我正在使用网络摄像头的源过滤器 当我在 graphstudio 中使用过滤器时 它有两个输出引脚 然而 在代码中 对 IEnumPins gt next 的调用始终返回 S FALSE 我还寻找了另一个可以创建引脚的接口 但没有找到这样的东
  • PHP S3上传进度

    这种情况已经发生过很多次了 但我仍然有点困惑 很多答案只关注谈论上传进度条 而不是从 S3 上传获取实际的上传进度 我已经阅读了很多问题并找到了很多软件 但我仍然没有更深入地理解 S3 上传的基本问题 有没有一种方法可以上传到 S3 同时了
  • “TypeError:item.getAttachmentsAsync 不是函数”Outlook 加载项 office-js 与 Vue

    我一直在关注此链接中的教程 https learn microsoft com en us javascript api outlook office messageread view outlook js preview getAttac
  • 如何删除jquery添加的样式属性

    我正在使用具有一些自定义要求的 devExpress 表 更新 休息了一天 然后回去并使用 React Styling 正确完成了它 感谢您的建议 在屏幕截图中 我禁用了某些单元格 但是 用户希望除所选行之外的所有单元格看起来均已禁用 使用
  • 跟随 NavigationLink 并返回后 SwiftUI .toolbar 消失

    我已将 toolbar 添加到 NavigationView 的顶层 最终将用于选择列表中的项目 而无需使用滑动手势 向上按钮 向下按钮等 我还有一个 navigationBar 正在进行 用于访问帐户和设置的其他视图 在大多数情况下 它看
  • D3.js:结合缩放/画笔

    我目前在 Mike Bostock 的工作画笔和缩放 https bl ocks org mbostock 34f08d5e11952a80609169b7917d4172例如 尽管我没有在 svg 上覆盖矩形对象 而是将其附加到我的图表上
  • 在文本文件中求和整数的最快方法

    Question 假设您有一个大型 ASCII 文本文件 每行都有一个随机非负整数 每个整数的范围从 0 到 1 000 000 000 文件中有 100 000 000 行 读取文件并计算所有整数之和的最快方法是什么 限制 我们有 10M
  • 如何通过在最近使用的文本框中单击光标按钮来插入文本?

    我有一个带有多个文本框和一组按钮的表单 使用下面的 Javascript 我可以单击一个按钮并将文本插入到指定的框中之一 单击按钮时是否可以将文本插入到最近 活动的文本框中 目前我有这个 但它使用的是文本框的特定 ID 而不是最近使用 活动
  • 是否可以仅使用免费软件在 C# 中将文档转换为 PDF 或编辑 PDF?

    我有一个愚蠢的想法 即创建一个 docx 或 rtf 或 pdf 格式的模板 然后替换该文档中的文本以生成报告 这似乎是比使用付费报告软件更好的方法 嗯 我相信我现在已经尝试了几乎所有的方法 但我很惊讶用 pdf 做任何事都是不可能的 Tr
  • 可通过 Jetpack Compose 中输入的文本 OutlinedTextField 进行调整

    我有一个 OutlinedTextField 里面有 DropdownMenu 我希望在按下 DropdownMenu 列表内的项目后 该项目的值开始位于 OutlinedTextField 内 并根据文本的长度根据宽度进行调整 我怎样才能
  • 如何在.Net Core中启用nginx反向代理与gRPC配合使用?

    我遇到了一个问题 无法让 nginx 与 gRPC 一起正常工作 我正在使用 Net core 3 1 来提供支持 REST 和 gRPC 的 API 我正在使用下面的 docker 镜像 Net Core 3 1 aspnet 3 1 a
  • 连接 Google 表格中的两个范围

    tl dr 如何使两个范围作为一个函数的参数出现 例如 我想查看 E 列 中的每个单元格except E5 MY FUNCTION somehowjoin E1 E4 E6 E 背景我正在 Google Sheets 中编写项目跟踪器 例如
  • 在选择查询中插入子查询

    我有一个 组 表和一个 参与者 表 现在我需要为每个组插入一名参与者 我将如何自动化这个 INSERT INTO Participants Name FirstName GroupID VALUES GENERIC GENERIC Grou
  • Atom Editor Golang - 转到声明不起作用

    我已经完成了atom的全新安装并安装了go plus软件包 我无法使用的一个功能是 转到声明 这就是为什么我仍然停留在崇高的土地上 有谁知道这是否适用于 golang 我的项目似乎不需要 ctags 对于atom来说 最好的方法是什么 我尝
  • 如何删除两个 UICollectionView 列之间的边距

    我有 UICollectionView 我希望单元格之间没有间距 然而 尽管我尽了一切努力 我似乎 无法删除该空间 Code CGFloat collectionView UICollectionView collectionView la
  • java.lang.LinkageError:违反加载器约束

    今天是个好日子 我遇到过这样的链接错误问题 java lang LinkageError loader constraint violation when resolving method javax xml transform Trans
  • node.js + MySQL 和 JSON 结果 - 回调问题和对客户端没有响应

    我想使用 node js 查询 mySQL 数据库并将结果作为 JSON 返回以在移动应用程序中使用 不幸的是 我的请求有点超时 服务器在 2 分钟内没有执行任何操作 直到日志文件显示我的请求console log 声明 此外 回调不会返回