javascript - 我应该如何将同步node.js模块与mysql、socket功能一起应用?

标签 javascript mysql node.js sockets synchronization

我正在尝试理解和使用sync-npm模块,但不确定如何更改下面的函数以匹配同步格式...(https://www.npmjs.com/package/sync)

基本上,我正在尝试使用从前端(客户端)接收的输入数据(在客户端以列表形式形成)并通过套接字将其发送到node.js。我尝试将其存储在全局变量“查询”中,但我了解到它没有更新。因此,当我尝试在套接字函数之外打印“查询”时,它不起作用。

听起来我应该使用同步模块,但我不太确定如何在我的代码中实现它...如果有人能给我一个如何更改下面的函数的想法,那就太好了...谢谢!

从前端接收输入数据并通过套接字发送到node.js

var server = app.listen(3001);
var socket = require('socket.io');
var io = socket(server);
var query = []

// Register a callback function to run when we have connection
io.sockets.on('connection',newConnection);
function newConnection(socket){
  console.log('new connection: ' + socket.id);
  socket.on('search', newSearch);
  function newSearch(final){
    query.push(final)

    console.log(query[0]);
    console.log(Array.isArray(query[0]));  //returns True
    console.log(query[0][0]);    // this also works
    console.log(query[0][1]);
  }
}
console.log('print');  
console.log(query);    
// this only gets printed in the beginning as an empty array

最终,我将解析该输入数据列表并将其连接到我的 sql 选择短语中。以下是我的数据库部分代码:

  var mysql      = require('mysql');
  var connection = mysql.createConnection({
    host     : '~~~',
    user     : '~~~',
    password : '~~~',
    database : '~~~'
  });

  connection.connect();
  console.log('mysql connected');

  var sql = 'select' + '*' + 'from EBN ';
  //ideally data in the 'query' list will concat with this sql string

  connection.query(sql,function(err,rows,fields){
    if(err){
      console.log(err);
    }
    else{
      fs.writeFileSync('search.json', JSON.stringify(rows), 'utf8');
    }
});

最佳答案

首先,您应该将执行查询的代码包装在函数中,例如

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : '~~~',
  user     : '~~~',
  password : '~~~',
  database : '~~~'
});

connection.connect();
console.log('mysql connected');

function executeQuery(query)

  var sql = 'select' + '*' + 'from EBN ';

  //do something with query and add it to the sql string

  connection.query(sql,function(err,rows,fields){
    if(err){
      console.log(err);
    }
    else{
      fs.writeFileSync('search.json', JSON.stringify(rows), 'utf8');
    }
  }
  
  
}

这是必要的,因为您不想在启动服务器后立即执行查询,而是仅在通过套接字收到查询消息后才执行。所以现在您可以在套接字消息处理程序中调用executeQuery(final)

您应该了解异步编程和回调在 nodejs/javascript 中的工作原理,以及为什么应该在服务器应用程序中尽可能多地使用它(例如,使用 fs.writeFile 而不是 writeFileSync)。您可以使用诸如sync之类的包来让您的生活更轻松,但前提是您确切知道自己想做什么。仅仅在可能由异步性引起的问题中添加名为“sync”的内容是行不通的。

关于javascript - 我应该如何将同步node.js模块与mysql、socket功能一起应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874230/

相关文章:

mysql - 删除某年之前的行的sql查询

php - 将连接中的表存储为 PHP 变量

javascript - "gameActivity" key 在开始时更改但应该停止

javascript - 使用 Canvas 创建和使用类

javascript - 使用 jquery 1.7 同步 POST

javascript - 销毁 Jquery 对话框后打开它

javascript - 我如何命名伪经典javascript

mysql - 我的返回结果是返回除一个以外的所有正确答案,没有错误

node.js - 无法获取 socket.io.js

node.js - 2 个 Node.js 服务器使用 nowjs 进行通信?