如何在NodeJS中的父函数范围内返回SQL结果?

时间:2018-05-23 00:26:26

标签: javascript node.js adobe-brackets

我目前正在使用括号文本编辑器扩展程序,它可以将您的工作时间保存在数据库中,并允许您查看时间条目。我正在使用NodeJS与SQL服务器进行交互。我已经能够按照自己的意愿输入时间,并且已成功使用select语句调用条目。但是,我试图在括号底部的面板上显示结果。

我无法弄清楚如何将select语句的结果传递给更广泛的范围,以便将其传递给main.js.我是Node的新手,已经阅读了很多关于回调和承诺的内容,但似乎没有任何帮助。我尝试使用回调但我无法从回调中获取值等于可以返回的变量。

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

这是代码:`

(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;

}());

`有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

对代码进行更改

"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;