如何在 NodeJS 中父函数的作用域中返回 SQL 结果?



我目前正在研究一个括号文本编辑器扩展,它将您的工作时间保存在数据库中并允许您查看您的时间条目。我正在使用NodeJS与SQL服务器进行交互。我已经能够根据需要输入时间,并且我已经成功地使用 select 语句调用了条目。但是,我正在尝试在括号底部的面板上显示结果。

我不知道如何将结果从我的选择语句获取到更广泛的范围,以便我可以将其传递给 main.js。我是 Node 的新手,读过很多关于回调和承诺的信息,但似乎没有任何帮助。我尝试使用回调,但我无法从回调中获取值以等于可以返回的变量。

更新:viewTime(( 函数作为承诺返回给 main.js。如果我可以将 con.connect(( 命名为常规函数,那么我可以通过 registerCommand (命令处理程序函数.js在 main 中调用它。

这是代码:'

(function () {
"use strict";
var mysql = require('mysql');
/**
* @private
*
* @return {array}
*/
function viewTime() {
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "brackets_timer_data"
});
con.connect(function(err) {
if (err) {
console.log(err);
} else {
console.log("Connected!");
}
con.query("SELECT * FROM work_sessions", function (err, result, fields) {
if (err) {
console.log(err);
}
//I need to get the result from here
});
});
//And return it here so I can pass the variable to main.js
}
/**
* Initializes the test domain with several test commands.
* @param {DomainManager} domainManager The DomainManager for the server
*/
function init(domainManager) {
if (!domainManager.hasDomain("view")) {
domainManager.registerDomain("view", {major: 0, minor: 1});
}
domainManager.registerCommand(
"view",       // domain name
"viewTime",    // command name
viewTime,   // command handler function
false,          // this command is synchronous in Node
"Returns time entry results.",
[{}],
[{name: "results", // return values
type: "array",
description: "Time entry results"}]
);
}
exports.init = init;
}());

"有什么想法吗?

您可以使用Promiseasync/await返回会话详细信息。首先,您需要链接Promise然后返回会话详细信息。应asyncmain.js中的调用函数以从承诺的函数读取返回值。

对代码进行这些更改,

"use strict";
let mysql = require('mysql');
function viewTime() {
let con = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: "brackets_timer_data"
});
return new Promise((resolve, reject) => {
con.connect(function (err) {
if (err) {
console.log('err while establishing connection ', err);
reject(err);
}
console.log('Connected!');
resolve();
});
}).then(() => {
con.query("SELECT * FROM work_sessions", function (err, result, fields) {
if (err) {
console.log('err in while fetching session details ', err);
return Promise.reject(err);
}
return Promise.resolve(result);
});
});
}
function init(domainManager) {
// your other code
viewTime().then(sessions => {
domainManager.registerCommand(
"view",       // domain name
"viewTime",    // command name
sessions,   // command handler function
false,          // this command is synchronous in Node
"Returns time entry results.",
[{}],
[{
name: "results", // return values
type: "array",
description: "Time entry results"
}]
);
}).catch(err => {
console.log('err in init()', err);
});
}
exports.init = init;

最新更新