我正在尝试理解和使用 sync-npm 模块,但不确定如何更改下面的函数以匹配同步格式......(https://www.npmjs.com/package/sync)
基本上,我正在尝试使用我从前端(客户端)接收的输入数据(在客户端形成为列表)并通过套接字将其发送到节点.js。我试图将其存储在我的全局变量"query"中,但我了解到它没有得到更新。因此,当我尝试在套接字功能之外打印"查询"时,它不起作用。
听起来我应该使用同步模块,但我不太确定如何在我的代码中实现它......如果有人能告诉我如何在下面更改我的功能,那就太好了。谢谢!
从前端接收输入数据并将其发送到节点.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"的东西是行不通的。