为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Node/JS 从异步回调方法中正确获取数据?

如何使用 Node/JS 从异步回调方法中正确获取数据?

萧十郎 2021-08-20 19:06:51
如果这已经被问了一百次,真的很抱歉,但我无法适应我发现的任何以前的 SO 解决方案来解决我的问题。其中很多都是特定于 Ajax 的。我是 Node 异步回调的新手,因此我遇到了从异步回调正确“返回”数据的问题。在我的示例中,我试图返回CharList. SQL 查询和数据都是有效的,所以这些都不太重要。我试过简单地返回值,我很快了解到这是不可能的,并且违背了异步回调的目的。编辑:我还尝试CharList在函数外部定义,然后通过函数分配值,但CharList在函数完成后记录会打印一个空数组。// index.jsconst sql = require('./sql')const query = require('./queries');function AllCharsToArray() {    query.character.GetAllChars(function(result) {        let CharList = [];        for (var i in result) {            CharList.push(result[i]._Name)        }    })}/*{    "characters":    [        {"_Name":"Charname 1"},        {"_Name":"Charname 2"},        {"_Name":"Charname 3"}    ]}*/// queries.jsconst mysql = require('mysql');const sql = require('./sql')function GetAllChars(callback) {    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {        return callback(results); // returns RowDataPacket    })}exports.character = {    GetAllChars: GetAllChars,}最终,我试图在CharList外部可用,AllCharsToArray以便我可以将它们导出到 express.js 路由。
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

建议的回调函数包含错误信息,如


// queries.js

const mysql = require('mysql');

const sql = require('./sql')


function GetAllChars(callback) {

    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {

        // change as

        if(error) {

            return callback(error)

        }

        callback(null,results); // returns RowDataPacket

    })

}


exports.character = {

    GetAllChars: GetAllChars,

}

在 index.js 上


...

function(req,res){

    query.character.GetAllChars(function(err,data){

       // check error info

       if(err){

          // console.debug(err)

          return res.send(err.message)

       }

       res.json(data)

    })

}

...


查看完整回答
反对 回复 2021-08-20
?
喵喔喔

TA贡献1735条经验 获得超5个赞

将 CharList 放在 AllCharsToArray() 之外


// index.js

const sql = require('./sql')

const query = require('./queries');


query.character.GetAllChars(function(result) {

    const CharList = [];


    for (var i in result) {

        CharList.push(result[i]._Name);

    }

    // launch the route after GetAllChars is done

    expressApp.get('getCharList', (req, res) => {

        res.json(CharList);

    });

});


查看完整回答
反对 回复 2021-08-20
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信