我正在尝试理解和使用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/