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

标签 javascript node.js adobe-brackets

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

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

更新: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;

}());

`有什么想法吗?

最佳答案

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

对您的代码进行这些更改,

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

关于javascript - 如何在 NodeJS 的父函数范围内返回 SQL 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478195/

相关文章:

javascript - 当应用程序处于 sleep 模式时,有没有办法在 PWA 中的服务工作人员中跟踪用户当前位置?

javascript - 动态添加的 dom 元素不响应 jQuery 函数

javascript - NodeJS/JS 如何通过 sha256 正确散列对象 json 和字符串(串联)

javascript - 为什么在使用 Live Editor 时 Brackets(代码编辑器)会打开一个新的 Chrome 实例?

css - 如何在 Brackets、Chrome 中启用 CDN CSS?

html - 括号实时预览不起作用

javascript - cURL 命令的 URL(字符串)等效项?

javascript - 如何用异步解决这个错误?

node.js - MongoDB连接

node.js - $npm install -g npm@latest 无法正常工作